函数‘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 设置定义宏:
_GNU_SOURCE
,开启仅 GNU 特性;
_POSIX_SOURCE
,开启 POSIX 功能;
- 也许还有其他人? (
_BSD_SOURCE
有可能,但我不确定)。
如果您使用 -std=cxx
编译,那么您将获得标准 C 而不是任何扩展。
所以这个警告是因为那个函数不是 C 标准的一部分。因此你得到了函数的隐式声明(这是旧的 C 标准所允许的,并为向后兼容而保留)。
如果您想使用 -std=cxx
进行编译,您可以将文件编辑为 #define _POSIX_SOURCE
。
我有以下代码:
#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 设置定义宏:
_GNU_SOURCE
,开启仅 GNU 特性;_POSIX_SOURCE
,开启 POSIX 功能;- 也许还有其他人? (
_BSD_SOURCE
有可能,但我不确定)。
如果您使用 -std=cxx
编译,那么您将获得标准 C 而不是任何扩展。
所以这个警告是因为那个函数不是 C 标准的一部分。因此你得到了函数的隐式声明(这是旧的 C 标准所允许的,并为向后兼容而保留)。
如果您想使用 -std=cxx
进行编译,您可以将文件编辑为 #define _POSIX_SOURCE
。