Oracle Solaris Studio 12.2:C++ 用户指南

2.5 预处理指令和名称

本节讨论了关于预处理 C++ 编译器所特有的指令的信息。

2.5.1 Pragma

预处理程序指令 pragma 是 C++ 标准的一部分,但每个编译器中,pragma 的形式、内容和含义都不相同。有关 C++ 编译器可识别的 pragma 的详细信息,请参见附录 B

Solaris Studio C++ 还支持 C99 关键字 _Pragma。以下两种调用是等效的:


#pragma dumpmacros(defs)     
_Pragma("dumpmacros(defs)") 

要使用 _Pragma 而不是 #pragma,请将 pragma 文本写成文字字符串(用括号括起来作为 _Pragma 关键字的一个参数)。

2.5.2 具有可变数目的参数的宏

C++ 编译器接受以下形式的 #define 预处理程序指令。


#define identifier (...) replacement_list
#define identifier (identifier_list, ...) replacement_list

如果列出的宏参数以省略号结尾,那么该宏的调用允许使用除了宏参数以外的其他更多参数。其他参数(包括逗号)收集到一个字符串中,宏替换列表中的名称 __VA_ARGS__ 可以引用该字符串。以下示例说明了如何使用可变参数列表的宏。


#define debug(...) fprintf(stderr, __VA_ARGS__)
#define showlist(...) puts(#__VA_ARGS__)
#define report(test, ...) ((test)?puts(#test):\
                        printf(__VA_ARGS__))
debug(“Flag”);
debug(“X = %d\n”,x);
showlist(The first, second, and third items.);
report(x>y, “x is %d but y is %d”, x, y);

其结果如下:


fprintf(stderr, “Flag”);
fprintf(stderr, “X = %d\n”, x);
puts(“The first, second, and third items.”);
((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y));

2.5.3 预定义的名称

附录中的A.2.8 -Dname[ =def]介绍了预定义的宏。可以在 #ifdef 这样的预处理程序条件中使用这些值。+p 选项可防止自动定义 sununixsparci386 预定义宏。

2.5.4 警告和错误

#error#warning 预处理程序指令可用来生成编译时诊断。

#error 标记字符串

发出错误诊断标记字符串并终止编译

#warning 标记字符串

发出警告诊断标记字符串并继续编译。