GCC在编译时不会发出警告

时间:2015-01-03 13:26:09

标签: c gcc gnu

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

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

因为我(void*)之前没有添加&x强制转型,因为%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

2 个答案:

答案 0 :(得分: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中)。

答案 1 :(得分:0)

GNU libc和C99 libc的文档(pdf的第315页)明确指出%p转换的参数必须是void *类型。< / p>

未发出警告这一事实应该是您的编译器对Cxx标准的看法的特殊性。 Ubuntu 14.04上的股票gcc 4.8.2发布了你帖子中提到的所有六个标准的警告。