gets()
函数已从C语言中移除。标准库中不再存在此函数。
但我编译以下代码:
#include <stdio.h>
int main (void)
{
(void) gets (NULL);
}
使用
gcc -std=c11 -pedantic-errors -Wall -Wextra
它可以编译而没有给出任何错误或警告。同样地,
#include <stdio.h>
int gets;
int main (void)
{}
编译会出错(错误:'gets' 作为不同类型的符号重新声明)。
在标准的第4节一致性§6中,我们可以读到:
一个一致的实现可能有扩展(包括额外的库函数),前提是它们不会改变任何严格一致程序的行为。
鉴于上述内容,我认为gcc即使在pedantic模式下也不符合标准。这是有原因的吗? 这是故意的还是一个错误?
GCC版本4.9.1。
编辑:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
gets
从未定义。在非严格模式下,我会收到“警告:'gets'函数是危险的,不应使用。”的提示。第二个片段没有问题,因为没有任何东西阻止您声明一个名为gets
的符号。例如,int printf;
是完全合法的。我是否错过了问题的要点? - Stefano Sanfilippogets
-- 或者说fgets
。如果某个实现支持gets
,那么它是由库而不是编译器实现的。 - Keith Thompson<stdio.h>
头文件中,gets
仍然被声明,但该声明被#if !defined __USE_ISOC1
...#endif
所包围。实现仍然存在,但以一种允许用户代码定义具有相同名称的函数的方式存在。 - Keith Thompson