「#pragmaGCCdiagnosticpush」と「#pragmaGCCdiagnosticpop」を使用して、コードの警告をオンにしてからオフにしようとしています(たとえば、ヘッダーが終了したら)。しかし、私がポップしたときに警告が期待どおりにオフになっていません。この簡単な例として:
int main(int, char*[]) {
int i;
unsigned int ui;
i==ui; // no warning as expected
// this push doesn't make any difference
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wsign-compare"
i==ui; // warns as expected
// this push doesn't make any difference in warning output
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsign-compare"
i==ui; // no warning as expected
#pragma GCC diagnostic pop
i==ui; // warns as expected
#pragma GCC diagnostic pop
i==ui; // warns unexpectedly
// I can put as many pops as I want here, nothing changes
#pragma GCC diagnostic pop
i==ui; // warns unexpected
return 0;
}
gcc 4.6(および4.7)で、コマンドラインから警告が有効になっていない場合(またはコマンドラインで-Wno-sign-compareが渡された場合でも)、警告はテキストでマークされているとおりです。つまり、コマンドラインの値に戻すことができないようです。これがどのように機能するのか誤解していますか?
物事を機能させる方法についての指針はありますか?
gccマニュアルの例でも同じ動作が見られます。
int test() {
int a,b,c,d;
#pragma GCC diagnostic warning "-Wuninitialized"
foo(a); /* warning is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
foo(b); /* no diagnostic for this one */
#pragma GCC diagnostic pop
foo(c); /* warning is given for this one */
#pragma GCC diagnostic pop
foo(d); /* warning is given here too, for some reason */
}