2

我正在尝试使用“#pragma GCC 诊断推送”和“#pragma GCC 诊断弹出”为我的代码打开警告,然后退出(例如,一旦标题结束)。但是当我弹出时,警告并没有按预期关闭。作为一个简单的例子:

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