我试图弄清楚如何使用 C 预处理器将 #define
的 int 连接到 #define
的字符串。我的编译器是 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
经典的 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)
额外的间接级别将允许预处理器在宏转换为字符串之前对其进行扩展。
一种可行的方法是将 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)
MY_FILE
的参数是宏,例如 A
和 B
,则此宏将扩展为 "/home..." "A" "B"
。
您可以使用 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)
C
标签。
#
仅适用于宏参数。但是,需要使用STR_HELPER
宏来避免将宏MAJOR_VER
变成字符串"MAJOR_VAR"
,而我们希望结果是"2"
。