串联预处理器定义成字符串
问题描述:
我有这样的:串联预处理器定义成字符串
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define REVISION b
#define VERSION VERSION_MAJOR.VERSION_MINOR REVISION
#define _STRINGIFY(x) #x
#define STRINGIFY(x) _STRINGIFY(x)
int version_major = VERSION_MAJOR;
int version_minor = VERSION_MINOR;
char *revision = STRINGIFY(REVISION);
char *version_string = STRINGIFY(VERSION);
然而,这台version_string
到"1.0 b"
。我想消除VERSION_MINOR和REVISION之间的空间。我试过这个:
#define VERSION VERSION_MAJOR.VERSION_MINOR##REVISION
但它产生"1.VERSION_MINORREVISION"
。显然,这无法正常工作或:
#define VERSION VERSION_MAJOR.VERSION_MINORREVISION
是否可以将两者连接起来预处理值,而不必之间的空间?
答
经过更多的挖掘,我发现它确实是可能的,这里是如何。
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define REVISION b
#define _STRINGIFY(x) #x
#define STRINGIFY(x) _STRINGIFY(x)
/* here's the magic */
#define _CONCAT(x,y) x##y
#define CONCAT(x,y) _CONCAT(x,y)
#define VERSION VERSION_MAJOR.CONCAT(VERSION_MINOR,REVISION)
int version_major = VERSION_MAJOR;
int version_minor = VERSION_MINOR;
char *revision = STRINGIFY(REVISION);
char *version_string = STRINGIFY(VERSION);
像STRINGIFY
,宏CONCAT
需要有两个层面来定义,使其工作。
的输出是:
int version_major = 1;
int version_minor = 0;
char *revision = "b";
char *version_string = "1.0b";
如预期。
答
在C中彼此相邻的两个字符串被视为单个字符串并自动连接。所以,如果您有"abc" "def"
,这与"abcdef"
相同。同样,如果你有A和B的宏,那么#A #B
会连接它们。
例如,此代码应产生你正在寻找的VERSION_STRING:
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define REVISION b
#define STRINGIFY(x) #x
#define VERSION_STR(A,B,C) STRINGIFY(A) "." STRINGIFY(B) STRINGIFY(C)
char *version_string = VERSION_STR(VERSION_MAJOR, VERSION_MINOR, REVISION);
我意识到,我拿出在字符串化间接的水平;如果你想把它放回到其他的宏中,那很好。 –