连接预处理器定义以形成字符串

时间:2016-11-18 12:25:54

标签: c c-preprocessor

我有这个:

#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

是否可以连接两个预处理器值而中间没有空格?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

经过多次挖掘后,我发现它确实是可能的,而且这是怎么回事。

Could not scan for classes inside "[mysite]/vendor/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php" which does not appear to be a file nor a folder

#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

正如所料。