C预处理器:将int连接到string

我想弄清楚如何使用C预处理器将# #define int连接到# #definestring。 我的编译器是CentOS 5上的GCC 4.1。该解决scheme也适用于MinGW。

我想追加一个版本号到一个string,但唯一的办法就是让版本号的副本定义为string。

我能find的最接近的是一个引用macros参数的方法,但是它不适用于#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) 

额外的间接级别将允许预处理器在将macros转换为string之前展开macros。

一个可行的方法是把MY_FILE写成一个参数macros:

 #define MY_FILE(x,y) "/home..." #x #y 

编辑:正如“Lindydancer”所指出的,这个解决scheme不会扩展参数中的macros。 更一般的解决scheme是:

 #define MY_FILE_(x,y) "/home..." #x #y #define MY_FILE(x,y) MY_FILE_(x,y) 

你可以用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)