C++ 困惑于#pragma GCC诊断推送/弹出“;
我试图使用“#pragma GCC diagnostic push”和“#pragma GCC diagnostic pop”为我的代码打开警告,然后再关闭(例如,一旦标题结束)。但是当我弹出时,警告并没有像预期的那样关闭。举个简单的例子: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
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 */
}
我认为第一次推送只会推送命令行选项的状态。在这里,因为没有,没有什么可以推的。这是我能想出的唯一解决办法。