4

我有这个:

#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)
integer version_major = VERSION_MAJOR;
integer version_minor = VERSION_MINOR;
string revision = STRINGIFY(REVISION);
string 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

是否可以在没有空格的情况下连接两个预处理器值?

更新:我更改了语言,因为问题是关于预处理器而不是关于语言。我实际上需要它用于 LSL,尽管我最初使用 C 语法提出了这个问题,这对更多用户来说是熟悉的,但是 LSL 不允许通过使它们相邻来形成更长的字符串文字。

4

2 回答 2

5

经过更多的挖掘,我发现确实可以,方法如下。

#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)

integer version_major = VERSION_MAJOR;
integer version_minor = VERSION_MINOR;
string revision = STRINGIFY(REVISION);
string version_string = STRINGIFY(VERSION);

就像STRINGIFY,宏CONCAT需要定义两个级别才能使其工作。

输出是:

integer version_major = 1;
integer version_minor = 0;
string revision = "b";
string version_string = "1.0b";

正如预期的那样。

于 2016-11-18T22:05:56.253 回答
2

在 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);
于 2016-11-19T16:47:17.430 回答