在C语言中,#pragma
和_Pragma()
有什么区别?
语法:
#pragma arg
_Pragma(arg)
我什么时候应该使用_Pragma(arg)
?
在C语言中,#pragma
和_Pragma()
有什么区别?
语法:
#pragma arg
_Pragma(arg)
我什么时候应该使用_Pragma(arg)
?
C99
引入了_Pragma
操作符。_Pragma(arg)
是一个操作符,类似于sizeof
或defined
,可以嵌入宏中。
根据cpp.gnu.org参考:
其语法为
_Pragma (string-literal)
,其中string-literal可以是正常的字符字符串字面量或宽字符字符串字面量。它被去字符串化,将所有的\\
替换为单个的\
,并将所有的\"
替换为"
。 然后,该结果会像出现在#pragma
指令的右侧一样进行处理。例如:_Pragma ("GCC dependency \"parse.y\"")
使用宏也可以达到与
#pragma GCC dependency "parse.y"
相同的效果,例如根据IBM教程:
#define DO_PRAGMA(x) _Pragma (#x) DO_PRAGMA (GCC dependency "parse.y")
_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指令指定特定于机器或操作的编译器功能。 __pragma关键字是专为微软编译器设计的,使您能够在宏定义中编写Pragma指令。
同样来自相同链接:
__pragma()关键字
仅适用于Microsoft
编译器还支持__pragma关键字,其具有与#pragma指令相同的功能,但可以在宏定义中内联使用。不能在宏定义中使用#pragma指令,因为编译器会将井号字符(“#”)解释为字符串化运算符(#)。
所以基本上你可以始终使用#pragma
而不是__pragma()
。没有必要使用__pragma()
,但有时可以使用它。
_Pragma
,根据C99标准,它是标准C语言的一部分。请参阅C17 6.10.9。与可能是某些MS代码的__pragma
不同。由于答案没有涉及问题中使用的语法,因此您可能需要更新此答案。原始问题中使用的_pragma
既不是ISO C也不是(据我所知)MS代码。 - Lundin
_Pragma
运算符作为#pragma
的替代品。很可能_pragma
是类似的,但是针对某个厂商(微软?)。 - Jonathan Leffler