【问题标题】:#pragma objective-c: can you have more than just 'mark'?#pragma objective-c:你能拥有的不仅仅是“标记”吗?
【发布时间】:2013-06-13 14:39:39
【问题描述】:

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

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

【问题讨论】:

  • 如果有人进来并发布了 500 个实际有效的无证关键字会很有趣 :)
  • 您可以执行// FIXME:Some text that you want// TODO:something to do #pragma once 之类的操作
  • 是的,还有其他的,比如#pragma clang diagnostic ...
  • 我已经给出了使用#pragma clang diagnostic ignored的答案,这很有用stackoverflow.com/questions/14444203/…

标签: ios objective-c pragma


【解决方案1】:

首先,举几个例子:

  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. 维基百科 [link] 说 clang 也支持 #pragma once

最后,这里是clang API documentation 的链接,用于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 中的解析代码似乎表明并非所有这些都已实现,即使前端接受它们也是如此。

【讨论】:

    【解决方案2】:

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

    6.10.6 Pragma 指令语义 1

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

    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 的回答很好地涵盖了实现定义指令的示例。如需完整列表,请参阅编译器的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      相关资源
      最近更新 更多