iOS中#pragma clang diagnostic的常見用法

將警告識別為錯誤

??如果我們希望一個警告必須被修改掉,以保證程序的安全,我們可以將警告識別為錯誤,雖然xcode的設置中可以將警告全部識別為錯誤,但這樣做根本毫無意義,很多三方庫都或多或少存在一些警告,這會導致項目很難編譯通過。
??例:在項目中有些時候不得已需要通過Selector的方式執(zhí)行方法的時候,又不想因為找不到Selector而導致unrecognized selector sent to instance的崩潰問題,就可以將找不到的Selector識別為錯誤:

    // clang診斷push
#pragma clang diagnostic push
    // 將undeclared selector警告識別為error
#pragma clang diagnostic error "-Wundeclared-selector"
    [self performSelector:@selector(noMethod) withObject:nil];
    // clang診斷pop,如果不pop,下面寫的代碼,也會將undeclared selector識別為error
#pragma clang diagnostic pop

??可以發(fā)現(xiàn)原本應該是警告的被識別為錯誤了:


忽略警告

??同樣如果我們希望一個警告在編譯的時候,不被識別為警告,我們就可以對警告進行忽略,下面同樣以undeclared selector警告為例:

#pragma clang diagnostic push
    // 忽略undeclared selector的警告
#pragma clang diagnostic ignored "-Wundeclared-selector"
    [self performSelector:@selector(noMethod) withObject:nil];
#pragma clang diagnostic pop

組合

??實際上,clang diagnostic并不只有上面的兩種固定用法,error:警告識別為錯誤還是ignored:忽略警告都可以根據(jù)自己的需求進行選擇。
??而警告的類型也不止-Wundeclared-selector:undeclared selector一種,其他的比如:

-Wdeprecated-declarations      廢棄的方法
-Wincompatible-pointer-types  指針類型不匹配
-Warc-retain-cycles                  Block的循環(huán)引用
-Wunused-variable                   未使用的變量

??如果上面這些都不是你想要的,下面來個全集吧:http://fuckingclangwarnings.com/
??同樣#pragma clang diagnostic也可以寫成#pragma GCC diagnostic,clang和GCC都是前端編譯器,不過clang是蘋果專門為mac系統(tǒng)做的。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容