使用getchar_unlocked
并使用--std=c99
标志进行编译后会发出警告 -
警告:隐式声明函数'getchar_unlocked'[-Wimplicit-function-declaration]
如果没有标记编译,不会发出任何警告。有什么方法可以解决它吗?
答案 0 :(得分:3)
从C99开始,在调用函数之前必须有一个可见的函数原型。虽然早期的C标准只是愚蠢地假设编译器未知的任何函数都具有格式int func (params)
,这反过来会在大多数情况下导致严重的错误。
正确声明getchar_unlocked
的原型,并且该错误将消失。
请注意,任何标准库中都不存在此类功能。看来你可能需要为编译器包含一些非标准的库才能找到函数。
答案 1 :(得分:3)
_unlocked
个get...
个版本的功能是POSIX扩展。它们不是C99标准功能的一部分。 get...
函数的完整列表在7.19.1.5中给出:getwc
,getwchar
,getc
,getchar
和gets
(已弃用)
当该函数不在此列表中时,符合C99的编译器必须警告您,您的程序可能无法与其他符合C99的编译器一起编译。
答案 2 :(得分:1)
像-ansi
和-std=c99
这样的方言选择选项会导致编译器定义某些宏(除了改变接受的方言)。
库头文件对这些宏做出反应。
确切地说,它们的反应与系统有关(编译器不提供C库),但是你可以广泛期望的一个常见行为是,如果你单独使用其中一个标志(没有任何其他&# 34;特征选择宏"),它具有隐藏不在指定的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-ish 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
声明。它已经很老了,可以追溯到1996年的POSIX.1。
注意:在某些系统上,多个功能选择宏不能合理地播放;它们给你一个集合交集而不是联合,这样-D_POSIX_SOURCE
和-D_BSD_SOURCE
一起结束意义&#34;只向我宣告那些已经标准化的经典BSD特有的少数函数POSIX也是#34;,这意味着几乎没有声明。
答案 3 :(得分:0)
getchar_unlocked
不是C标准函数。
编译它强制c99
标准本身不支持它。