在C99中的getchar_unlocked()隐式声明

时间:2016-07-07 06:16:41

标签: c c99

使用getchar_unlocked并使用--std=c99标志进行编译后会发出警告 -

  

警告:隐式声明函数'getchar_unlocked'[-Wimplicit-function-declaration]

如果没有标记编译,不会发出任何警告。有什么方法可以解决它吗?

4 个答案:

答案 0 :(得分:3)

从C99开始,在调用函数之前必须有一个可见的函数原型。虽然早期的C标准只是愚蠢地假设编译器未知的任何函数都具有格式int func (params),这反过来会在大多数情况下导致严重的错误。

正确声明getchar_unlocked的原型,并且该错误将消失。

请注意,任何标准库中都不存在此类功能。看来你可能需要为编译器包含一些非标准的库才能找到函数。

答案 1 :(得分:3)

_unlockedget...个版本的功能是POSIX扩展。它们不是C99标准功能的一部分。 get...函数的完整列表在7.19.1.5中给出:getwcgetwchargetcgetchargets(已弃用)

当该函数不在此列表中时,符合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标准本身不支持它。