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

jon*_*scb 80 c stringification c-preprocessor

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

我想在字符串上附加一个版本号,但我能让它工作的唯一方法是将版本号的副本定义为字符串.

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

这不起作用.

#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)

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

  • 在这种情况下STR()将给出一个窄字符串.是否有变体将其转换为宽字符串? (3认同)
  • 我无法说出我搜索过多少次并从此确切答案中复制了该词,但它将以两位数表示 (3认同)
  • 第一个“STR_HELPER”是必需的,因为“#”仅适用于宏参数。我花了一些时间才弄清楚.. (2认同)
  • @clarkttfu,有点——是的,“#”仅适用于宏参数。然而,需要`STR_HELPER`宏来避免将宏`MAJOR_VER`转换为字符串`"MAJOR_VAR"`,我们希望结果为`"2"`。 (2认同)

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)

  • 这是一个干净的解决方案,不幸的是,它不起作用.如果传递给`MY_FILE`的参数是宏,比如说'A`和`B`,这个宏将扩展为``/ home ...""A""B"`. (4认同)