Ped*_*eno 4 c-preprocessor linden-scripting-language
我有这个:
#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);
Run Code Online (Sandbox Code Playgroud)
然而,这设置version_string为"1.0 b". 我想消除 VERSION_MINOR 和 REVISION 之间的空格。我试过这个:
#define VERSION VERSION_MAJOR.VERSION_MINOR##REVISION
Run Code Online (Sandbox Code Playgroud)
但它产生"1.VERSION_MINORREVISION". 显然,这也行不通:
#define VERSION VERSION_MAJOR.VERSION_MINORREVISION
Run Code Online (Sandbox Code Playgroud)
是否可以连接两个预处理器值而中间没有空格?
更新:我更改了语言,因为问题是关于预处理器而不是关于语言。我实际上需要它来实现 LSL,尽管我最初使用 C 语法来表述这个问题,这对于更多用户来说是熟悉的,但 LSL 不允许通过使它们相邻来形成更长的字符串文字。
经过更多挖掘,我发现这确实是可能的,方法如下。
#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);
Run Code Online (Sandbox Code Playgroud)
像 一样STRINGIFY,宏CONCAT需要定义两个级别才能使其工作。
输出是:
integer version_major = 1;
integer version_minor = 0;
string revision = "b";
string version_string = "1.0b";
Run Code Online (Sandbox Code Playgroud)
正如预期的那样。