美文网首页程序员
#pragma预处理指令与_Pragma操作符

#pragma预处理指令与_Pragma操作符

作者: Billlin | 来源:发表于2018-01-17 12:08 被阅读0次

#pragma预处理指令

在C/C++标准中,#pragma是一条预处理的指令。

  • #pragma mark - messageopt

    整理代码,#pragma mark - 用来提供类似注释功能,同时也方便在代码区上方的导航条中快速定位自己的方法。

  • #pragma clang

    clang是诊断设置,是#pragma的常用命令。

    • #pragma clang diagnostic ignored "-相关命令"

      #pragma clang diagnostic push
      #pragma clang diagnostic ignored "-相关命令"
      //自己的代码
      #pragma clang diagnostic pop

      查看更多相关命令

      例子:忽略-Warc-performSelector-leaks警告

      #pragma clang diagnostic push
      #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
         [wTarget performSelector:sel withObject:nil];
      #pragma clang diagnostic pop
      

      例子:忽略循环引用警告

      #pragma clang diagnostic push    
      #pragma clang diagnostic ignored "-Warc-retain-cycles"   
          self.completionBlock = ^ {    
              ...    
          };    
      #pragma clang diagnostic pop  
      

      在开发过程中,大部分警告都不应该被忽略,因为大部分真的是警告。

  • #pragma message "message"

    强制警告,与#warning message在效果上是一致的。顺便提一下#error message可以强制编译失败。


_Pragma操作符

_Pragma操作符具有与#pragma指令相同的功能。
相比预处理指令#pragma,_Pragma操作符可用于宏定义中的内联。#pragma指令不能用于宏定义中,因为编译器会将指令中的数字符号("#")解释为字符串化运算符(#)。

例子:宏定义忽略-Warc-performSelector-leaks警告

#define PERFORMSELECTOR(expression) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
expression \
_Pragma("clang diagnostic pop") \

// 调用
PERFORMSELECTOR([wTarget performSelector:sel withObject:nil];);

Which Clang Warning Is Generating This Message?

相关文章

网友评论

    本文标题:#pragma预处理指令与_Pragma操作符

    本文链接:https://www.haomeiwen.com/subject/dwbyoxtx.html