C语言中#pragma和_Pragma()有什么区别?

22

在C语言中,#pragma_Pragma()有什么区别?

语法:

#pragma arg
_Pragma(arg)

我什么时候应该使用_Pragma(arg)


6
C 标准提供了 _Pragma 运算符作为 #pragma 的替代品。很可能 _pragma 是类似的,但是针对某个厂商(微软?)。 - Jonathan Leffler
2个回答

25

C99引入了_Pragma操作符。_Pragma(arg)是一个操作符,类似于sizeofdefined,可以嵌入宏中。

根据cpp.gnu.org参考:

其语法为_Pragma (string-literal),其中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的详细信息和示例,请查看。


11

来自这里:

Pragma指令指定特定于机器或操作的编译器功能。 __pragma关键字是专为微软编译器设计的,使您能够在宏定义中编写Pragma指令。

同样来自相同链接:

__pragma()关键字

仅适用于Microsoft

编译器还支持__pragma关键字,其具有与#pragma指令相同的功能,但可以在宏定义中内联使用。不能在宏定义中使用#pragma指令,因为编译器会将井号字符(“#”)解释为字符串化运算符(#)。

所以基本上你可以始终使用#pragma而不是__pragma()。没有必要使用__pragma(),但有时可以使用它。


3
经过修改后,OP提到了_Pragma,根据C99标准,它是标准C语言的一部分。请参阅C17 6.10.9。与可能是某些MS代码的__pragma不同。由于答案没有涉及问题中使用的语法,因此您可能需要更新此答案。原始问题中使用的_pragma既不是ISO C也不是(据我所知)MS代码。 - Lundin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接