2

「#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 */
}
4

0 に答える 0