8

我熟悉#pragma mark objective-c / xcode / ios 开发,它对于查找代码段很有用。

但是,我想知道除了“标记”之外是否还有其他关键字。比如,你能做#pragma somethingelse吗?提前致谢!

4

2 回答 2

7

首先,举几个例子:

  1. 您可以控制诊断:

    http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas

  2. 并且来自同一个链接:

    • clang 支持 Microsoft 的“ #pragma pack”功能来控制记录布局。GCC 也包含对这个特性的支持,但是在 MSVC 和 GCC 不兼容的地方,clang 遵循 MSVC 定义。

    • clang 支持 Microsoft#pragma comment(lib, "foo.lib")自动链接指定库的功能。目前,此功能仅适用于 Visual C++ 链接器。

    • clang 支持 Microsoft#pragma comment(linker, "/flag:foo")将链接器标志添加到 COFF 目标文件的功能。用户负责确保链接器理解这些标志。

    不过,该列表中的第二个和第三个不适用于您的 iOS 代码。

  3. 维基百科 [链接] 说 clang#pragma once也支持。

最后,这里是处理代码的clang API 文档的链接。pragma您可以从那里浏览以查看其他所有内容。特别是, TokenKinds.def 描述了所有接受的令牌,所以大概它是完整的:

#pragma unused
#pragma GCC visibility [push/pop]
#pragma pack [value/show/push/pop/etc/etc/etc]
#pragma clang __debug parser_crash
#pragma clang __debug captured
#pragma ms_struct [on/off]
#pragma align [native/natural/mac68k/power/reset]
#pragma weak [identifier]
#pragma weak [identifier = identifier] // alias
#pragma redefine_extname [identifier identifier]
#pragma STDC FP_CONTRACT
#pragma OPENCL EXTENSION
#pragma omp [...]
#pragma detect_mismatch
#pragma comment

中的解析代码ParsePragma.cpp似乎表明并非所有这些都已实现,即使前端接受它们也是如此。

于 2013-06-13T14:47:55.837 回答
0

是的。它通常用于实现定义的指令,但有一些是在 C 中定义的。

6.10.6 Pragma 指令语义 1

  1. 预处理标记 STDC 不立即跟随指令中的 pragma形式# pragma pp-tokensopt new-line的预处理指令(在任何宏替换之前)导致实现以实现定义的方式运行。该行为可能会导致翻译失败或导致翻译器或生成的程序以不合格的方式运行。任何不被实现识别的编译指示都会被忽略。

  2. 如果预处理标记 STDC 确实紧跟指令中的 pragma(在任何宏替换之前),则不对指令执行宏替换,并且该指令应具有以下形式之一,其含义在别处描述:

    #pragma STDC FP_CONTRACT on-off-switch

    #pragma STDC FENV_ACCESS on-off-switch

    #pragma STDC CX_LIMITED_RANGE on-off-switch

    `on-off-switch`: one of `ON OFF DEFAULT`
    

Carl Norum 的回答很好地涵盖了实施定义指令的示例。有关完整列表,您应该参考编译器的文档。

于 2013-06-13T16:53:14.073 回答