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

问题描述 投票:0回答:2

C语言中的

#pragma
_Pragma()
有什么区别?

语法:

#pragma arg

_Pragma(arg)

我什么时候应该使用

_Pragma(arg)

c macros c-preprocessor
2个回答
27
投票

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

根据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 指令指定特定于机器或操作的编译器功能。 特定于 Microsoft 编译器的 __pragma 关键字使您能够在宏定义内编写 pragma 指令。

另外(相同链接):

__pragma() 关键字

微软特定

编译器还支持

__pragma

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

所以基本上你总是可以使用

#pragma

 而不是 
__pragma()
。没必要用
__pragma()
,但有时
可以用。

© www.soinside.com 2019 - 2024. All rights reserved.