我正在尝试使用“#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 */
}