#pragma clang
1勘伺、 #pragma clang diagnostic
使用這個(gè)指令可使編譯器 禁用、開(kāi)啟脖咐、改變代碼在編譯中出現(xiàn)的錯(cuò)誤或警報(bào)断箫。例如:你可以在方法前使用編譯指令瓜浸,取消方法中的警報(bào)澳淑。
1)#pragma clang diagnostic ignored
#pragma clang diagnostic ignored "-Wname"
忽略名稱為name
引起的警報(bào),編譯器不再提示警報(bào)信息插佛。例如 “unused
”杠巡。
2) #pragma clang diagnostic warning
#pragma clang diagnostic warning "-Wname"
與上一條相反,對(duì)于由name
引起的警報(bào)雇寇。編譯器將給出警報(bào)提示。
3)#pragma clang diagnostic error
#pragma clang diagnostic error "-Wname"
代碼出現(xiàn)name
所指的問(wèn)題谢床,編譯器提示“Error”,編譯不過(guò)识腿。
4)#pragma clang diagnostic push, #pragma clang diagnostic pop
#pragma clang diagnostic push
#pragma clang diagnostic pop
#pragma clang diagnostic push
編譯器對(duì)哪些錯(cuò)誤給警報(bào)提示造壮,哪些錯(cuò)誤忽略警報(bào)提示,將此刻的狀態(tài)存儲(chǔ)起來(lái)耳璧,后續(xù)可將此設(shè)置狀態(tài)復(fù)原成箫。
#pragma clang diagnostic pop
恢復(fù)剛才利用#pragma clang diagnostic push
存儲(chǔ)的狀態(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]
警報(bào)。方法
foo1
中昆汹,使用#pragma clang diagnostic ignored "-Wmultichar"
,foo1 中的代碼沒(méi)有編譯警報(bào)满粗。方法
foo2
, 在foo1
方法結(jié)束后,#pragma clang diagnostic pop
指令將剛才#pragma clang diagnostic push
保存的狀態(tài)又恢復(fù)了,所以foo2
有警報(bào)提示挤聘。方法
foo3
,使用#pragma clang diagnostic error "-Wmultichar"
指令组去,所以編譯器產(chǎn)生了Error
。方法
foo4
添怔, 在foo3
前后使用指令 B
&指令 D
湾戳,所以指令 C
的作用域只作用只在foo3
中广料。foo3
之前的指令指令 A
在指令 B
之前砾脑,所以foo4
在指令 A
的作用域內(nèi),foo4
沒(méi)有編譯警報(bào)艾杏。
3 常用示例
- 對(duì)于編譯器不能識(shí)別的方法韧衣,取消編譯器警報(bào)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// 需要禁用警告的代碼
[self performSelectorOnMainThread:@selector(updatePaddingConstraints) withObject:nil waitUntilDone:NO];
#pragma clang diagnostic pop