C语言 忽略除最后一个诊断之外的所有 #pragma GCC 诊断



使用#pragma GCC diagnostic push/pop/warning/ignored...似乎只有最后#pragma- 行生效!为什么? 例如,我从这里复制并修改了 gcc 7.3.0 给出的示例

#include <stdio.h>
#include <stdint.h>
static void foo();
static void bar();
static void car();
static void dar();
int main() {
#pragma GCC diagnostic warning "-Wunused-variable"
foo();         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
bar();         /* no diagnostic for this one */
#pragma GCC diagnostic pop
car();         /* error is given for this one */
#pragma GCC diagnostic pop
dar();         /* depends on command line options */
return 0;

}
static void foo() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
static void bar() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
static void car() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
static void dar() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}

以两种方式编译上面的代码

  1. 在命令行中添加-Wall

  2. 在命令行中省略-Wall

将导致 1. 对所有对foo()bar()car()dar()的调用发出警告,而 2. 不会对任何调用发出警告,暗示最后一个#pragma GCC diagnostic pop是唯一生效的,并且是遵循命令行规则的那个。 当然,我不是仅仅通过这个例子得出这个结论的,而是我在这里代表

的那个。关于为什么会这样的任何想法?我做错了吗?

编辑: 接受的答案导致了以下有效的代码:

#include <stdio.h>
#include <stdint.h>
static void foo();
static void bar();
static void car();
static void dar();
int main() {

foo();         /* error is given for this one */

bar();         /* no diagnostic for this one */
car();         /* error is given for this one */
dar();         /* depends on command line options */
return 0;

}
#pragma GCC diagnostic warning "-Wunused-variable"
static void foo() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
static void bar() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
#pragma GCC diagnostic pop
static void car() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}
#pragma GCC diagnostic pop
static void dar() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}

使用最后一个#pragma,因为foobar都放在所有杂注行之后。试试这个:

#pragma GCC diagnostic warning "-Wunused-variable"
static void foo() {
volatile uint32_t testArray[UINT8_MAX] = {0};
}

pragma会影响此行之后的代码,并且不会像预期的那样遵循函数调用。

最新更新