以下代码编译并运行但我在编译时会发出警告:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int x = 10;
printf("%p\n",&x);
return EXIT_SUCCESS;
}
带命令行参数的
-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
。
答案 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)