#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 常用示例
- 對于編譯器不能識別的方法,取消編譯器警報
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// 需要禁用警告的代碼
[self performSelectorOnMainThread:@selector(updatePaddingConstraints) withObject:nil waitUntilDone:NO];
#pragma clang diagnostic pop