Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 困惑于#pragma GCC诊断推送/弹出“;_C++_Gcc_Pragma - Fatal编程技术网

C++ 困惑于#pragma GCC诊断推送/弹出“;

C++ 困惑于#pragma GCC诊断推送/弹出“;,c++,gcc,pragma,C++,Gcc,Pragma,我试图使用“#pragma GCC diagnostic push”和“#pragma GCC diagnostic pop”为我的代码打开警告,然后再关闭(例如,一旦标题结束)。但是当我弹出时,警告并没有像预期的那样关闭。举个简单的例子: 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 pop”为我的代码打开警告,然后再关闭(例如,一旦标题结束)。但是当我弹出时,警告并没有像预期的那样关闭。举个简单的例子:

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;
}
在GCC4.6(和4.7)中,命令行未启用任何警告(甚至在命令行上传递了-Wno符号比较),警告如文本中所示。也就是说,似乎无法将内容弹出回命令行值。我是不是误解了这是怎么回事

有没有关于如何让事情顺利进行的建议

我在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 */
}

我认为第一次推送只会推送命令行选项的状态。在这里,因为没有,没有什么可以推的。这是我能想出的唯一解决办法。