C中#pragma和_Pragma()之间的区别

Jay*_*esh 7 c macros c-preprocessor

C #pragma_Pragma()C 之间有什么区别?

句法:

#pragma arg
Run Code Online (Sandbox Code Playgroud)

_Pragma(arg)
Run Code Online (Sandbox Code Playgroud)

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

msc*_*msc 12

_Pragma运营商介绍C99._Pragma(arg)是一个运算符,很像sizeof或者defined,可以嵌入到宏中.

根据cpp.gnu.org参考:

它的语法是

_Pragma(string-literal);

其中string-literal可以是普通字符串文字或宽字符字符串文字.通过将所有\替换为单个\并将所有\"替换为"来对其进行细化.然后处理结果,好像它出现在#pragma指令的右侧.例如,

 _Pragma ("GCC dependency \"parse.y\"")
Run Code Online (Sandbox Code Playgroud)

例如,使用宏可以实现相同的效果

 #define DO_PRAGMA(x) _Pragma (#x)
 DO_PRAGMA (GCC dependency "parse.y")
Run Code Online (Sandbox Code Playgroud)

根据IBM教程:

_Pragma运算符是指定#pragma指令的另一种方法.例如,以下两个语句是等效的:

#pragma comment(copyright, "IBM 2010")
_Pragma("comment(copyright, \"IBM 2010\")")
Run Code Online (Sandbox Code Playgroud)

编译以下代码时,将字符串IBM 2010插入到C++目标文件中:

_Pragma("comment(copyright, \"IBM 2010\")")
int main() 
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

有关_pragma的更多信息,请参见示例.


CIs*_*ies 8

这里:

Pragma指令指定特定于机器或操作的编译器功能.__pragma关键字(特定于Microsoft编译器)使您能够在宏定义中编写pragma指令.

另外(同一个链接):

__pragma()关键字

微软具体

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

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

  • 编辑后,OP 提到了`_Pragma`,它是 C99 中的标准 C。见 C17 6.10.9。不像`__pragma`,它很可能是一些MS goo。您可能想要更新此答案,因为它没有解决问题中使用的语法。最初的问题有“_pragma”,它既不是 ISO C 也不是(据我所知)MS goo。 (3认同)