以下代码编译并运行但我在编译时会发出警告:
#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)
-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.
为什么会这样呢?
首先,我还可以在我的机器上使用 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 中)。