函数‘fgetc_unlocked’的隐式声明,使用 gcc 5.2

Implicit declaration of function ‘fgetc_unlocked’, using gcc 5.2

我有以下代码:

#include <stdio.h>

int main() {
    putc_unlocked('a', stdout);
    return 0;
}

当我使用 gcc file.c 编译它时没有出现错误,但是,如果我使用 gcc -std=c11 file.c,我得到:

file.c: In function ‘main’:
file.c:4:2: warning: implicit declaration of function ‘putc_unlocked’ [-Wimplicit-function-declaration]
  putc_unlocked('a', stdout);
  ^

为什么?

因为 -std=c11 强制执行 严格名称 space(C89 和 C99 也是如此)。

任何非 C11 强制要求的标识符都不得可见。由于 putc_unlocked 不是 C11 标识符,因此没有可见的声明,因此声明是隐式的。

使用 -std=cxx 进行编译,其中 xx 为 99 或 11,具体取决于您使用的 C 版本将使用与使用 -std=gnuxx 进行编译(再次 xx = 99 或 11)不同的头文件。

GCC 5.2 的默认设置(如果您未指定命令行参数)适用于 -std=gnu11

gnu 设置定义宏:

  1. _GNU_SOURCE,开启仅 GNU 特性;
  2. _POSIX_SOURCE,开启 POSIX 功能;
  3. 也许还有其他人? (_BSD_SOURCE 有可能,但我不确定)。

如果您使用 -std=cxx 编译,那么您将获得标准 C 而不是任何扩展。

所以这个警告是因为那个函数不是 C 标准的一部分。因此你得到了函数的隐式声明(这是旧的 C 标准所允许的,并为向后兼容而保留)。

如果您想使用 -std=cxx 进行编译,您可以将文件编辑为 #define _POSIX_SOURCE