使用 C 预处理器将 int 连接到 string

我正在试图找出如何使用 C预处理器将一个 #define’d int 连接到一个 #define’d 字符串。我的编译器是 CentOS 5上的 GCC 4.1。这个解决方案也应该适用于 MinGW。

我希望在字符串上附加一个版本号,但是使其工作的唯一方法是复制定义为字符串的版本号。

我能找到的最接近的方法是引用宏参数,但它不适用于 #define

这样不行。

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

没有 #它也不能工作,因为值是数字,它会展开为 "/home/user/.myapp" 2 6,这是无效的 C

这确实有效,但是我不喜欢拥有版本定义的副本,因为我也需要它们作为数字。

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING
57980 次浏览

You can do that with BOOST_PP_STRINGIZE:

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)

Classical C preprocessor question....

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)


#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

The extra level of indirection will allow the preprocessor to expand the macros before they are converted to strings.

A working way is to write MY_FILE as a parametric macro:

#define MY_FILE(x,y) "/home..." #x #y

EDIT: As noted by "Lindydancer", this solution doesn't expand macros in arguments. A more general solution is:

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)