GCC在编译时不会发出警告

Spi*_*rix 8 c gcc gnu

以下代码编译并运行但我在编译时会发出警告:

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x = 10;
  printf("%p\n",&x);

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

GCC,来自使用命令行参数的在线编译器

-Wall -std=gnu99 -O2 -o a.out source_file.c -pedantic -Wextra
Run Code Online (Sandbox Code Playgroud)

编译时发出以下警告

source_file.c: In function ‘main’:
source_file.c:7:3: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("%p\n",&x);
Run Code Online (Sandbox Code Playgroud)

因为我之前没有添加一个(void*)强制转换,因为我在 编译时需要一个类型&x%p.But的参数void*

gcc SO.c -o so -Wall -Wextra -pedantic -std=c11
Run Code Online (Sandbox Code Playgroud)

要么

gcc SO.c -o so -Wall -Wextra -pedantic -std=c99
Run Code Online (Sandbox Code Playgroud)

要么

gcc SO.c -o so -Wall -Wextra -pedantic -std=c89
Run Code Online (Sandbox Code Playgroud)

GCC(在我的电脑中)没有发出警告,而编译(再次在我的电脑中)使用

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu11
Run Code Online (Sandbox Code Playgroud)

要么

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu99
Run Code Online (Sandbox Code Playgroud)

要么

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu89
Run Code Online (Sandbox Code Playgroud)

要么

gcc SO.c -o so -Wall -Wextra -pedantic
Run Code Online (Sandbox Code Playgroud)

我收到上面提到的警告.为什么会那样?我的GCC版本是4.8.1,我正在使用Windows.我从控制台编译,即cmd.

oua*_*uah 2

为什么会这样呢?

首先,我还可以在我的机器上使用 mingw32 gcc 4.8.1 重现这种不一致的状态。

虽然 C 标准不要求进行诊断(不违反约束),但 gcc 没有理由使用-std=gnu11或 不使用 来发出诊断-std=c11

此外,在我的机器上的 Linux 上使用 gcc 4.8.2 时,诊断结果会同时显示-std=c11-std=gnu11

所以它看起来像是 gcc 中的一个错误(在 gcc 4.8.1 或 mingw32 gcc 4.8.1 中)。