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
答案 0 :(得分:4)
这是一个编译器错误,根据N3337 16.3.2(cpp.stringize)p2(引用的其余部分被剪切):
字符串文字是 string-literal ,没有前缀。如果,在更换 list,参数前面紧跟
#
预处理令牌,两者都被替换 由单个字符串文字预处理令牌包含的拼写 预处理相应参数的标记序列。每次出现白色空间 参数之间的预处理标记成为单个空格字符 字符串文字。