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

标签 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

最佳答案

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

A character string literal is a string-literal with no prefix. If, in the replacement list, a parameter is immediately preceded by a # preprocessing token, both are replaced by a single character string literal preprocessing token that contains the spelling of the preprocessing token sequence for the corresponding argument. Each occurrence of white space between the argument’s preprocessing tokens becomes a single space character in the character string literal.

关于C++ 预处理器删除可变参数宏调用中的空格 (Solaris Studio 12.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219063/

相关文章:

在预处理阶段之后但在汇编阶段之前进行编译

c++ - C可变参数宏调用另一个可变参数宏

java - 如何使用 JConsole 分析交换空间

bash - bash 脚本会预先解析语法吗?

c++ - 存储 FIX 消息的最佳数据结构是什么?

c++ - 共享对象文件中的 undefined symbol

random - 使用 C 预处理器生成随机数

c++ - boost1.44.0 文件系统 v3 无法在 solaris sparc 64 位平台上正常运行

c++ - 自定义流缓冲区能否在程序退出时和请求输入时自动刷新?

c++ - 垃圾收集在内存中移动引用的对象会破坏 Unreal4 引擎中的引用吗?