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

Cla*_*dio 11 c++ solaris c-preprocessor 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;
}
Run Code Online (Sandbox Code Playgroud)

C预处理器按预期工作:

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

$ cc -V
cc: Sun C 5.12 SunOS_i386 2011/11/16
Run Code Online (Sandbox Code Playgroud)

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

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

$ CC -V
CC: Sun C++ 5.12 SunOS_i386 2011/11/16
Run Code Online (Sandbox Code Playgroud)

LTh*_*ode 4

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

\n\n
\n

字符串文字是没有前缀的字符串文字。如果在替换列表中,参数前面紧跟着#预处理标记,则两者都将替换为单个字符串文字预处理标记,其中包含相应参数的预处理标记序列的拼写。参数\xe2\x80\x99s 预处理标记之间每次出现的空格 \n 都会成为 \n 字符串文字中的单个空格字符。

\n
\n