Учитывая 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 для Blue Gene / P, V9.0
Я знаю, что это не дает прямого ответа на ваш вопрос, но вы могли бы избежать предупреждения, изменив код на
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);
}
Как указывает сообщение, его идентификатор сообщения — 1540-2826, поэтому измените отчет #pragma на:
#pragma report (отключить, «1540-2826»)
Вы можете указать компилятору не генерировать это предупреждение (для любого кода, а не только для рассматриваемой строки), передав флаг -qsuppress=1540-2826
,
Для подавления нескольких предупреждений разделяйте коды точкой с запятой, например, -qsuppress=1540-2826:1540-0809
,
Идентификаторы сообщений об ошибках, создаваемые IBM XL C ++, зависят от операционной системы. В z / OS идентификаторы сообщений выглядят как CCN8826, но в других местах они выглядят как 1540-2826.
В z / OS UNIX System Services, компилирование кода с использованием xlc++ tmp.cpp
не дает никаких предупреждений или ошибок. В любом случае добавление
-qsuppress=CCN8826
с командной строкой xlc ++, если нужно, чтобы эта ошибка появилась. Основываясь на ответе Джоша Милторпа,
-qsuppress=1540-2826
должен работать в операционных системах, где используется этот формат идентификатора сообщения.
Обратите внимание, что не все сообщения могут быть подавлены, поэтому, если вы получаете жалобу на сообщение, которое вы пытаетесь скрыть, это может быть связано с тем, что это конкретное сообщение не может быть подавлено, даже если вы используете правильный формат для указания сообщения, которое нужно подавить.
Сообщения z / OS V2R2 XL C / C ++ Документ предполагает, что только сообщения с номерами от 3000 до 4399 (для C) и от 5001 до 6999 и от 7500 до 8999 (для C ++) могут быть подавлены. Если я укажу -qsuppress=CCN1142
в z / OS UNIX System Services для исходного файла, который выдает сообщение CCN1142, затем я получаю жалобу на «Нераспознанное значение« CCN1142 », указанное с опцией« SUPPRESS ». ‘ и сообщение CCN1142 продолжает поступать. -qsuppress=CCN8826
не предъявляет претензий.