0

我有以下代码:

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

为什么?

4

2 回答 2

3

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

GCC 5.2 的默认设置(如果您没有指定命令行参数)是 for -std=gnu11.

gnu 设置定义了宏:

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

如果你编译,-std=cxx那么你会得到标准的 C 而不是任何扩展。

所以这个警告是因为该函数不是 C 标准的一部分。因此,您获得了函数的隐式声明(旧 C 标准允许这样做并保持向后兼容性)。

#define _POSIX_SOURCE如果你想编译你可以编辑你的文件-std=cxx

于 2015-11-27T09:52:00.697 回答
0

因为-std=c11强制执行严格的名称空间(如 C89 和 C99)。

C11 未规定的任何标识符都不得可见。由于putc_unlocked不是 C11 标识符,因此没有可见的声明,因此声明是隐式的。

于 2015-11-27T09:51:26.940 回答