GCC 在编译时不发出警告

GCC does not emit a warning when compiling

以下代码编译并运行,但我希望在编译时出现警告:

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

int main(void){

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

  return EXIT_SUCCESS;
}

GCC,from an online compiler 带命令行参数

-Wall -std=gnu99 -O2 -o a.out source_file.c -pedantic -Wextra

编译时出现如下警告

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);

因为我没有在 &x 之前添加 (void*) 强制转换,因为 %p 需要 void* 类型的参数 .但是当我使用

编译时
gcc SO.c -o so -Wall -Wextra -pedantic -std=c11

gcc SO.c -o so -Wall -Wextra -pedantic -std=c99

gcc SO.c -o so -Wall -Wextra -pedantic -std=c89

GCC(在我的电脑中)在使用

编译(再次在我的电脑中)时发出警告
gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu11

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu99

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu89

gcc SO.c -o so -Wall -Wextra -pedantic

我收到上述警告。为什么会这样?我的 GCC 版本是 4.8.1,我使用的是 Windows。我从控制台编译,即 cmd.

Why is it like that?

首先,我也可以在我的机器上用 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 中)。

GNU libc and C99 libc (page 315 of the pdf) 的文档明确指出 %p 转换的参数 "must be of type void *"。

未发出警告这一事实应该是您的编译器对 Cxx 标准的看法的特殊性。 Ubuntu 14.04 上的股票 gcc 4.8.2 对 post.

中提到的所有六个标准发出警告