【问题标题】:GCC does not emit a warning when compiling [duplicate]编译时GCC不会发出警告[重复]
【发布时间】:2015-01-03 13:26:08
【问题描述】:

以下代码编译并运行,但我希望在编译时出现警告:

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

因为我没有在&amp;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(在我的 PC 中)在编译(再次在我的 PC 中)使用时发出警告

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 ,我不太清楚,但使用gcc -v 显示Target: mingw32。所以我猜它的mingw gcc

标签: c gcc gnu


【解决方案1】:

为什么会这样?

首先,我也可以在我的机器上使用 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 中)。

【讨论】:

  • 我假设 mingw 在 printf() 声明的 mingw 的 stdio 头文件中缺少 __attribute__((format(printf,3,4))) - 没有它,printf 只是一个普通的可变参数函数,并且不能提供格式检查by -Wformat
  • @nos 可能是,但格式属性的 gcc 文档说 编译器总是(除非使用 -ffreestanding 或 -fno-builtin)检查标准库函数 printf、[.. .] 每当请求此类警告时(使用 -Wformat),因此无需修改头文件 stdio.h 所以即使没有属性 gcc 似乎也应该警告。
  • @ouah ,这个问题和this one有关吗?
  • @CoolGuy 不错,是的,看起来是这样,我认为您的问题应该被标记为重复。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2015-09-25
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多