【发布时间】:2015-08-17 15:28:06
【问题描述】:
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.Conformance §6 中,我们可以阅读:
符合标准的实现可能有扩展(包括额外的 库函数),只要它们不改变任何 严格符合程序
鉴于上述情况,我认为 gcc 不符合标准,即使在迂腐模式下也是如此。是否有一个原因?这是故意的还是错误的?
GCC 版本 4.9.1。
编辑:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
【问题讨论】:
-
GCC 4.8.2 在这里。在迂腐模式下,第一个 sn-p 不会编译,因为从未定义过
gets。在非迂腐模式下,我得到warning: the `gets' function is dangerous and should not be used.。第二个 sn-p 不是问题,因为没有什么可以阻止您声明一个名为gets的符号。例如,int printf;是完全合法的。我错过了问题的重点吗? -
我支持 gcc 4.9.1 特有的错误,因为版本 4.8.2 和 > 4.9.2 确实失败了。
-
MinGW 使用微软的标准库,甚至不能正确支持 C99。
-
@hacks:不,gcc 从未支持过
gets-- 或fgets。如果给定实现支持gets,则它由库实现,而不是由编译器实现。 -
@hacks:是也不是。在 GNU C 库提供的
<stdio.h>头文件中,gets仍然被声明,但声明被#if !defined __USE_ISOC1...#endif包围。 实现仍然存在,但允许用户代码定义具有相同名称的函数。
标签: c gcc language-lawyer c11 gets