C ++预处理器删除对可变参数宏的调用中的空白(Solaris Studio 12.3)

时间:2014-10-06 15:01:04

标签: c++ c-preprocessor solaris variadic-macros solaris-studio

Oracle Solaris Studio 12.3的C ++预处理器在展开__VA_ARGS__时完全删除了空格。

有人可以在他们的系统上确认这种行为吗?它是一个已知的编译器错误吗?这个问题有没有解决方法?

为了说明,这是一个简单的测试程序,vaargs.c

#include <stdio.h>

#define PRINT(...) printf("%s\n", #__VA_ARGS__)

int main()
{
    PRINT(hello world);

    return 0;
}

C预处理器按预期工作:

$ cc vaargs.c -o vaargs && ./vaargs
hello world

$ cc -V
cc: Sun C 5.12 SunOS_i386 2011/11/16

但是C ++预处理器删除了“hello”和“world”之间的空间:

$ CC vaargs.c -o vaargs && ./vaargs
helloworld

$ CC -V
CC: Sun C++ 5.12 SunOS_i386 2011/11/16

1 个答案:

答案 0 :(得分:4)

这是一个编译器错误,根据N3337 16.3.2(cpp.stringize)p2(引用的其余部分被剪切):

  

字符串文字 string-literal ,没有前缀。如果,在更换   list,参数前面紧跟#预处理令牌,两者都被替换   由单个字符串文字预处理令牌包含的拼写   预处理相应参数的标记序列。每次出现白色空间   参数之间的预处理标记成为单个空格字符   字符串文字。