C预处理器:将int连接到string
我想弄清楚如何使用C预处理器将# #define
int连接到# #define
string。 我的编译器是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)