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