美文网首页
iOS #pragma clang

iOS #pragma clang

作者: Jaly_xxx | 来源:发表于2017-08-07 16:24 被阅读41次

    #pragma clang

    1、 #pragma clang diagnostic

    使用这个指令可使编译器 禁用、开启、改变代码在编译中出现的错误或警报。例如:你可以在方法前使用编译指令,取消方法中的警报。

    1)#pragma clang diagnostic ignored

    #pragma clang diagnostic ignored "-Wname"
    忽略名称为 name 引起的警报,编译器不再提示警报信息。例如 “unused”。

    2) #pragma clang diagnostic warning

    #pragma clang diagnostic warning "-Wname"
    与上一条相反,对于由 name 引起的警报。编译器将给出警报提示。

    3)#pragma clang diagnostic error

    #pragma clang diagnostic error "-Wname"
    代码出现 name 所指的问题,编译器提示“Error”,编译不过。

    4)#pragma clang diagnostic push, #pragma clang diagnostic pop

    #pragma clang diagnostic push
    #pragma clang diagnostic pop
    #pragma clang diagnostic push 编译器对哪些错误给警报提示,哪些错误忽略警报提示,将此刻的状态存储起来,后续可将此设置状态复原。
    #pragma clang diagnostic pop 恢复刚才利用 #pragma clang diagnostic push 存储的状态。

    2、使用例子

    
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wmultichar"
    void foo1( void )
    {
        __unused char c = (char) 'ab';
    }
    #pragma clang diagnostic pop
    
    void foo2( void )
    {
        __unused char c = (char) 'ab';
    }
    
    #pragma clang diagnostic ignored "-Wmultichar"   // 指令 A
    #pragma clang diagnostic push                    // 指令 B
    void foo3( void )
    {
    #pragma clang diagnostic error "-Wmultichar"     // 指令 C
        /* Here, the diagnostic message is elevated to error severity. */ 
        char c = (char) 'ab';
    }     
    #pragma clang diagnostic pop                     // 指令 D
    
    void foo4( void )
    {
        __unused char c = (char) 'ab';
    }  
    
    • 由于 __unused char c = (char) 'ab';这句代码,编译器默认给出warning: multi-character character constant [-Wmultichar]警报。

    • 方法 foo1 中,使用#pragma clang diagnostic ignored "-Wmultichar",foo1 中的代码没有编译警报。

    • 方法 foo2, 在 foo1 方法结束后,#pragma clang diagnostic pop 指令将刚才 #pragma clang diagnostic push 保存的状态又恢复了,所以 foo2 有警报提示。

    • 方法 foo3,使用 #pragma clang diagnostic error "-Wmultichar" 指令,所以编译器产生了 Error

    • 方法 foo4, 在foo3 前后使用 指令 B & 指令 D,所以 指令 C 的作用域只作用只在 foo3 中。 foo3 之前的指令 指令 A指令 B 之前,所以 foo4指令 A 的作用域内, foo4 没有编译警报。

    3 常用示例

    1. 对于编译器不能识别的方法,取消编译器警报
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wundeclared-selector"
        // 需要禁用警告的代码
        [self performSelectorOnMainThread:@selector(updatePaddingConstraints) withObject:nil waitUntilDone:NO];
    #pragma clang diagnostic pop
        
    

    Reference

    相关文章

      网友评论

          本文标题:iOS #pragma clang

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