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

C中的#pragma_Pragma()什么区别?

句法:

 #pragma arg 

 _Pragma(arg) 

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

从这里 :

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

另外(同一个链接):

__pragma()关键字

微软具体

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

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

_Pragma运算符在C99引入。 _Pragma(arg)是一个运算符,非常类似于sizeof或已defined ,可以嵌入到宏中。

根据cpp.gnu.org参考:

它的语法是

_Pragma(string-literal);

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

  _Pragma ("GCC dependency \"parse.y\"") has the same effect as #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的更多信息,请参见示例。