为什么在C99中不允许隐式声明gets()?

Mr.*_*son 2 c gets c99 clang cs50

我开始学习C语言编程,这是我所指代的代码,其中显示了一些源代码,gets()而我的IDLE也认识到它。但是仍然在编译时,我的编译器不同意它。

谁能帮我吗?我gets()在main函数中使用clang作为编译器。

Joh*_*ode 6

扩展我的评论:

首先,从来没有使用gets(),因任何原因,即使是在玩具代码。如果您在示例程序中看到它,请忽略该示例并继续。它在C99中已弃用,并在C2011中从标准库中完全删除,因为它是一个主要的安全漏洞。由该功能引起的胃灼热值得打破30多年的遗留代码。

其次,在C89及更早版本下,如果编译器在看到声明或定义之前先看到函数调用,则它将假定函数返回了int-IOW,该函数的隐式声明为int。如果稍后在同一翻译单元中有函数定义,并且函数返回int,则可以:

int foo( void )
{
  int x = bar(); // bar *implicitly* declared to return int
}

int bar( void ) // implicit declaration matches definition, we're good
{
  return some_integer_value;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果bar没有没有返回int,你会因为隐含得到一个错误int的声明并没有与非匹配int的定义。

gets()不返回char *int因此不管的隐式声明gets是错误的。

C99 int完全删除了隐式声明-从那时起,必须先声明或定义所有函数,然后才能调用它们。

编辑

您收到该隐式声明错误的最可能原因是您的编译器足够新,因此不再具有getsin 的声明stdio.h