鉴于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 ++高级版
答案 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
不会投诉。