jon*_*scb 80 c stringification c-preprocessor
我试图找出如何使用C预处理器将#define
'd int 连接到#define
'字符串.我的编译器是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
Run Code Online (Sandbox Code Playgroud)
它不没有工作,#
小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6
,这是无效的Ç.
这确实有效,但我不喜欢有版本定义的副本,因为我确实需要它们作为数字.
#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
Run Code Online (Sandbox Code Playgroud)
Lin*_*cer 144
经典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)
Run Code Online (Sandbox Code Playgroud)
额外的间接级别将允许预处理器在将宏转换为字符串之前扩展宏.
Giu*_*ini 10
一种工作方式是将MY_FILE写为参数宏:
#define MY_FILE(x,y) "/home..." #x #y
Run Code Online (Sandbox Code Playgroud)
编辑:正如"Lindydancer"所述,此解决方案不会在参数中扩展宏.更通用的解决方案是:
#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)
Run Code Online (Sandbox Code Playgroud)