2012-12-13 75 views
1

鑑於tmp.cpp:如何禁用特定的IBM XL C++編譯器警告?

#include <stdio.h> 

#pragma report(disable, CCN8826) 

int main(int argc, const char *argv[]) 
{ 
    const char * hi = "hi\n"; 
    printf(hi); 

    return 0; 
} 

儘管我用#pragma report是應該禁止的警告,我仍然得到:

bash-3.1$ xlC -qformat=all tmp.cpp 
"tmp.cpp", line 8.12: 1540-2826 (W) The format string is not a string literal 
and format arguments are not given. 

如何擺脫警告?

該錯誤消息號是here和在#pragma報告描述是here。 我的編譯器是IBM XL C/C++高級版的藍色基因/ P,V9.0

+2

'#pragma'語句中的消息標識符和編譯器警告不匹配。也許你應該使用'#pragma report(禁用,CCN2826)'而不是? – Praetorian

+0

你明確告訴它打開所有格式的診斷信息...... – user7116

+1

@Praetorian:實際上CCN8826是每個用戶手冊的編譯器信息標識符。 – user7116

回答

2

我知道這並不直接回答你的問題,但你大概可以改變你的代碼避免警告

printf("%s", hi); 

如果您有:

void f(char * s) { printf(s); } 

你可以修改它爲:

void f(char * s) { printf("%s", s); } 

擺脫警告。

編輯:一個簡單的,輕度受限,可能是討厭處理新問題的辦法是

char buf[1024]; 
snprintf(buf, sizeof(buf), "%s %s", "bloody", "warning"); 
fprintf(stderr, "%s", buf); 

也許可以概括這類似下面的

my_printf(const char* fmt, ...) 
{ 
    va_list ap; 
    char buf[1024]; 
    vsnprintf(buf, sizeof(buf), fmt, ap); 
    fprintf(stderr, "%s", buf); 
} 
(未經測試!)
+0

在這種特殊情況下它會有所幫助,但這僅僅是一個示例說清楚我想做什麼。原始代碼在概念上看起來像這樣:'void function(char * s){fprintf(stderr,s); }' –

+0

@mezhaka相同類型的解決方法可以應用 - 'void function(char * s){fprintf(stderr,「%s」,s); }' – simonc

+0

這太聰明瞭!我羨慕你想出了這個!我要編輯並接受你的回答。 –

2

作爲該消息指示,它的消息標識符是1540年至2826年,因此改變在#pragma報告:

的#pragma報告(禁用「 1540年至2826年」)

0

您可以通過傳遞標誌-qsuppress=1540-2826來告訴編譯器不要生成此警告(對於任何代碼,而不僅僅是相關行)。

要抑制多個警告,請使用分號分隔代碼。 -qsuppress=1540-2826:1540-0809

0

IBM XL C++生成的錯誤消息ID取決於操作系統。在z/OS上,消息ID看起來像CCN8826,但在其他地方看起來像1540-2826。

在z/OS UNIX系統服務上,使用xlc++ tmp.cpp編譯代碼不會產生警告或錯誤。在任何情況下,向xlC++命令行添加

-qsuppress=CCN8826 

應該在那裏做竅門,如果該錯誤確實顯示。根據Josh Milthorpe的回答,

-qsuppress=1540-2826 

應該在使用該消息ID格式的操作系統上工作。

注意並不是所有的消息可以被抑制,因此,如果你得到一個關於你試圖壓制那麼這可能是因爲無法抑制特定消息的消息的投訴,即使你使用正確的格式用於指定要壓制的消息。

z/OS V2R2 XL C/C++ Messages文件建議可以抑制只有消息編號3000至4399(對於C)以及5001至6999和7500至8999(對於C++)。如果我在z/OS UNIX系統服務上爲產生消息CCN1142的源文件指定了-qsuppress=CCN1142,那麼我會收到有關「無法識別的值」CCN1142「的選項」SUPPRESS「指定的投訴。並繼續報告消息CCN1142。​​不產生投訴。