我正在尝试弄清楚如何使用 C 预处理器将#define
'd int连接到#define
'd字符串。我的编译器是CentOS 5上的GCC 4.1。该解决方案也适用于MinGW。
我想在字符串上附加一个版本号,但我能让它工作的唯一方法是将版本号的副本定义为字符串。
我能找到的最接近的是引用宏参数的方法,但它不适用于#define
s
这不起作用。
#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
答案 0 :(得分:135)
经典C预处理器问题....
#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)
额外的间接级别将允许预处理器在将宏转换为字符串之前对其进行扩展。
答案 1 :(得分:10)
一种工作方式是将MY_FILE写为参数宏:
#define MY_FILE(x,y) "/home..." #x #y
编辑:正如“Lindydancer”所述,此解决方案不会在参数中展开宏。更通用的解决方案是:
#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)
答案 2 :(得分:2)
您可以使用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)