【问题标题】:Difference between #pragma and _Pragma() in CC语言中#pragma和_Pragma()的区别
【发布时间】:2017-08-03 07:16:54
【问题描述】:

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

语法:

#pragma arg

_Pragma(arg)

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

【问题讨论】:

  • C 标准提供_Pragma 运算符作为#pragma 的替代方案。 _pragma 很可能与某个供应商(微软?)相似但特定于某个供应商。

标签: c macros c-preprocessor


【解决方案1】:

_Pragma 运算符在C99 中引入。 _Pragma(arg) 是一个运算符,很像sizeofdefined,可以嵌入到宏中。

根据cpp.gnu.org参考:

它的语法是_Pragma (<i>string-literal</i>),其中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 tutorial

_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 的更多信息。

【讨论】:

    【解决方案2】:

    来自here

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

    还有(同一个链接):

    __pragma() 关键字

    微软特定

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

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

    【讨论】:

    • 编辑后,OP 提到了_Pragma,这是 C99 中的标准 C。见 C17 6.10.9。不像__pragma 这很可能是一些MS goo。您可能想要更新此答案,因为它没有解决问题中使用的语法。最初的问题有 _pragma 这既不是 ISO C 也不是(据我所知)MS goo。
    猜你喜欢
    • 2018-09-12
    • 2014-05-30
    • 2019-07-21
    • 2023-03-13
    • 1970-01-01
    • 2018-08-12
    • 2015-04-30
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多