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レポートの説明はここにあります。私のコンパイラは、Blue Gene / P、V9.0用のIBM XL C / C ++AdvancedEditionです。

4

4 に答える 4

2

メッセージが示すように、そのメッセージIDは1540-2826であるため、#pragmaレポートを次のように変更します。

#pragma report(disable、 "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

フラグを渡すことにより、この警告を生成しないようにコンパイラーに指示できます(問題の行だけでなく、任意のコードに対して)-qsuppress=1540-2826

複数の警告を抑制するには、コードをセミコロンで区切ります-qsuppress=1540-2826:1540-0809

于 2016-03-27T15:03:15.777 に答える
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 ++メッセージ文書は、メッセージ番号3000から4399(Cの場合)、および5001から6999と7500から8999(C ++の場合)のみを抑制できることを示しています。z / OS UNIXシステム・サービスでメッセージCCN1142を生成するソース・ファイルを指定-qsuppress=CCN1142すると、「オプション「SUPPRESS」で指定された認識されない値「CCN1142」」に関する苦情が表示されます。メッセージCCN1142は引き続き報告されます。 -qsuppress=CCN8826苦情はありません。

于 2017-05-18T11:53:40.113 に答える