# #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
沒有編譯警報。