2016-11-18 85 views
1

我有这样的:串联预处理器定义成字符串

#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 

是否可以将两者连接起来预处理值,而不必之间的空间?

回答

0

经过更多的挖掘,我发现它确实是可能的,这里是如何。

#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"; 

如预期。

1

在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); 
+0

我意识到,我拿出在字符串化间接的水平;如果你想把它放回到其他的宏中,那很好。 –