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.
中提到的所有六个标准发出警告
以下代码编译并运行,但我希望在编译时出现警告:
#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.
中提到的所有六个标准发出警告