[英]getchar_unlocked() implicit declaration in C99
使用getchar_unlocked
并使用--std=c99
标志进行编译会产生如下警告:
警告:函数'getchar_unlocked'的隐式声明[-Wimplicit-function-declaration]
如果不带标志进行编译,则不会发出任何警告。是否有任何解决方法?
从C99开始,在调用函数之前必须具有可见的函数原型。 尽管较早的C标准只是愚蠢地假设编译器未知的任何函数都具有int func (params)
格式,这反过来在大多数情况下会导致严重的错误。
正确声明getchar_unlocked
的原型,该错误将消失。
请注意,任何标准库中都不存在此类功能。 看来您可能必须包括一些非标准的库,编译器才能找到该函数。
_unlocked
版本的get...
函数是POSIX扩展。 它们不是C99标准功能的一部分。 get...
函数的完整列表在7.19.1.5中给出: getwc
, getwchar
, getc
, getchar
和gets
(不推荐使用)。
当该函数不在此列表中时,符合C99的编译器必须警告您程序不能与其他符合C99的编译器一起编译。
方言选择选项(例如-ansi
和-std=c99
使编译器定义某些宏(除了更改可接受的方言外)。
库头文件对这些宏做出反应。
它们的反应方式完全取决于系统(编译器未提供C库),但是您可以普遍预期的普遍行为是,如果您单独使用这些标志之一(不使用任何其他“功能选择宏”),它具有隐藏不在指定ISO C语言中的函数,宏和其他全局符号的声明的作用。
ISO C对getchar_unlocked
。 <stdio.h>
(通常是ISO C标头)中存在这样的声明是POSIX扩展,这基本上是不符合要求的,因为getchar_unlocked
是即使符合条件的C程序也可以使用的标识符,即使它们包含<stdio.h>
。 当您使用-ansi
或-std=c99
, <stdio.h>
标头会侦听并将其自身鞭打成符合ISO-C的形状,从而隐藏了此类扩展名。
在性能良好的POSIX系统上,您可以要求您使用ISO C语言, 并希望某些基本的1990年代式POSIX功能在头文件中可见,例如:
gcc -std=c99 -D_POSIX_SOURCE ...
^^^^^ "feature selection macro"
这些特征选择宏具有一门完整的科学知识,对于这个问题和答案来说太宽泛了。 它们的某些形式具有值,例如-D_XOPEN_SOURCE=500
。 _POSIX_SOURCE
不需要参数; 它是否已定义,但_POSIX_C_SOURCE
是数字。
我刚刚检查了glibc和Cygwin:在这两者上, _POSIX_SOURCE
足以显示getchar_unlocked
声明。 它很老,可以追溯到POSIX.1 1996。
当心:在某些系统上,多个功能选择宏不能合理发挥作用; 它们为您提供了一个设置的交集而不是并集,因此-D_POSIX_SOURCE
和-D_BSD_SOURCE
一起最终意味着“仅向我声明那些也已在POSIX中标准化的经典BSD的少数功能”。什么都没有宣布。
getchar_unlocked
不是C标准函数。
强制c99
标准对其进行编译本身不支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.