使用 C 预处理器将 int 连接到字符串

问题描述 投票:0回答:3

我正在尝试弄清楚如何使用

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
c c-preprocessor stringification
3个回答
230
投票

经典 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)

额外的间接级别将允许预处理器在将宏转换为字符串之前扩展宏。


16
投票

一种工作方式是将 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)

0
投票

您可以使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.