1

给定 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.

如何摆脱该警告?

错误消息编号在此处,#pragma 报告说明在此处。我的编译器是 IBM XL C/C++ Advanced Edition for Blue Gene/P, V9.0

4

4 回答 4

2

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

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

于 2012-12-14T04:12:49.613 回答
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);
}
于 2012-12-13T16:11:41.900 回答
0

IBM XL C++ 生成的错误消息标识取决于操作系统。在 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++ 消息文档建议只能抑制消息编号 3000 到 4399(对于 C)、5001 到 6999 和 7500 到 8999(对于 C++)。如果我-qsuppress=CCN1142在 z/OS UNIX 系统服务上为产生消息 CCN1142 的源文件指定,那么我会收到关于“使用选项“SUPPRESS”指定的无法识别的值“CCN1142”的投诉。继续上报消息CCN1142。 -qsuppress=CCN8826不产生任何抱怨。

于 2017-05-18T11:53:40.113 回答
0

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

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

于 2016-03-27T15:03:15.777 回答