C语言中的
#pragma
和_Pragma()
有什么区别?
语法:
#pragma arg
和
_Pragma(arg)
我什么时候应该使用
_Pragma(arg)
?
_Pragma
运算符在 C99
中引入。 _Pragma(arg)
是一个运算符,非常类似于 sizeof
或 defined
,并且可以嵌入到宏中。
根据cpp.gnu.org参考:
其语法为
,其中 string-literal 可以是普通字符串或宽字符字符串。 通过将所有_Pragma (string-literal)
替换为单个\\
并将所有\
替换为\"
来对其进行去字符串化。 然后处理结果,就好像它显示为"
指令的右侧一样。例如,#pragma
_Pragma ("GCC dependency \"parse.y\"")
与
具有相同的效果。 例如,使用宏可以实现相同的效果#pragma GCC dependency "parse.y"
#define DO_PRAGMA(x) _Pragma (#x) DO_PRAGMA (GCC dependency "parse.y")
根据IBM教程:
_Pragma 运算符是指定 #pragma 的另一种方法 指令。 例如,以下两个语句是等效的:
#pragma comment(copyright, "IBM 2010") _Pragma("comment(copyright, \"IBM 2010\")")
当执行以下操作时,字符串 IBM 2010 被插入到 C++ 目标文件中: 以下代码已编译:
_Pragma("comment(copyright, \"IBM 2010\")") int main() { return 0; }
有关 _pragma 的更多信息和示例。
从这里:
另外(相同链接):Pragma 指令指定特定于机器或操作的编译器功能。 特定于 Microsoft 编译器的 __pragma 关键字使您能够在宏定义内编写 pragma 指令。
__pragma() 关键字所以基本上你总是可以使用微软特定
编译器还支持
__pragma
关键字,它与#pragma
指令具有相同的功能,但可以在宏定义中内联使用。#pragma
指令不能在宏定义中使用,因为编译器会将指令中的数字符号字符 ('#') 解释为字符串化运算符 (#)。
#pragma
而不是
__pragma()
。没必要用
__pragma()
,但有时可以用。