如何禁用特定的IBM XL C ++编译器警告?

时间:2012-12-13 16:08:19

标签: c++ pragma suppress-warnings xlc

鉴于tmp.cpp:

#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。 我的编译器是用于Blue Gene / P,V9.0的IBM XL C / C ++高级版

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

如消息所示,其消息标识符为1540-2826,因此将#pragma报告更改为:

#pragma report(禁用,“1540-2826”)

答案 2 :(得分:0)

您可以通过传递标记-qsuppress=1540-2826告诉编译器不要生成此警告(对于任何代码,而不仅仅是相关行)。

要取消多个警告,请使用分号分隔代码,例如-qsuppress=1540-2826:1540-0809

答案 3 :(得分:0)

IBM XL C ++生成的错误消息ID取决于操作系统。在z / OS上,消息ID看起来像CCN8826,但在其他地方看起来像1540-2826。

在z / OS UNIX系统服务上,使用xlc++ tmp.cpp编译代码不会产生警告或错误。无论如何,添加

-qsuppress=CCN8826
如果出现错误,那么

到xlc ++命令行应该在那里做的伎俩。根据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,那么我会收到关于&#39;无法识别的值&#34; CCN1142&#34;使用选项&#34; SUPPRESS&#34;指定。&#39;并继续报告消息CCN1142。 -qsuppress=CCN8826不会投诉。