iOS #pragma clang

#pragma clang

1、 #pragma clang diagnostic

使用這個指令可使編譯器 禁用、開啟、改變代碼在編譯中出現(xiàn)的錯誤或警報。例如:你可以在方法前使用編譯指令,取消方法中的警報。

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"
代碼出現(xiàn) name 所指的問題,編譯器提示“Error”,編譯不過。

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

#pragma clang diagnostic push
#pragma clang diagnostic pop
#pragma clang diagnostic push 編譯器對哪些錯誤給警報提示,哪些錯誤忽略警報提示,將此刻的狀態(tài)存儲起來,后續(xù)可將此設(shè)置狀態(tài)復(fù)原。
#pragma clang diagnostic pop 恢復(fù)剛才利用 #pragma clang diagnostic push 存儲的狀態(tài)。

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';這句代碼,編譯器默認(rèn)給出warning: multi-character character constant [-Wmultichar]警報。

  • 方法 foo1 中,使用#pragma clang diagnostic ignored "-Wmultichar",foo1 中的代碼沒有編譯警報。

  • 方法 foo2, 在 foo1 方法結(jié)束后,#pragma clang diagnostic pop 指令將剛才 #pragma clang diagnostic push 保存的狀態(tài)又恢復(fù)了,所以 foo2 有警報提示。

  • 方法 foo3,使用 #pragma clang diagnostic error "-Wmultichar" 指令,所以編譯器產(chǎn)生了 Error

  • 方法 foo4, 在foo3 前后使用 指令 B & 指令 D,所以 指令 C 的作用域只作用只在 foo3 中。 foo3 之前的指令 指令 A指令 B 之前,所以 foo4指令 A 的作用域內(nèi), 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

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

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

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