GCC编译时没有发出警告提示

8
以下代码可以编译并运行,但是我希望在编译时能够得到警告信息:
#include <stdio.h>
#include <stdlib.h>

int main(void){

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

  return EXIT_SUCCESS;
}

使用在线编译器GCC,带有命令行参数

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

因为在%p之前我没有添加(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命令行工具编译的。


是mingw gcc,cygwin gcc还是其他什么? - ouah
@ouah,我不确定,但使用gcc -v命令显示的是Target: mingw32。所以我猜测它是mingw gcc。 - Spikatrix
2个回答

2
为什么会这样?
首先,我也可以在我的机器上使用mingw32 gcc 4.8.1复现这种不一致状态。
虽然C标准不需要诊断(没有约束违反),但是没有理由gcc使用-std=gnu11而不是-std=c11发出诊断。
此外,在我的Linux机器上,使用gcc 4.8.2时,无论是-std=c11还是-std=gnu11都会出现诊断。
所以看起来像是gcc的一个bug(无论是在gcc 4.8.1还是mingw32 gcc 4.8.1中)。

我会假设mingw在stdio头文件中的printf()声明中缺少__attribute__((format(printf,3,4))) - 没有这个,printf就只是一个普通的可变参数函数,并且-Wformat无法提供格式检查。 - nos
1
@nos可能是,但gcc的格式属性文档说:“编译器总是(除非使用-ffreestanding或-fno-builtin)检查标准库函数printf等的格式,每当请求此类警告时(使用-Wformat),因此无需修改头文件stdio.h”,所以即使没有属性,gcc也应该发出警告。 - ouah
@ouah,这个问题是否与这个问题有关? - Spikatrix
@CoolGuy 感觉很棒,是的,看起来是这样,我认为你的问题应该被标记为重复。 - ouah

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接