gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:18:52 27 4
gpt4 key购买 nike

我开始学习 C 语言编程,我引用代码的书显示了一些带有 gets() 的源代码我的 IDLE 也能识别它。但是仍然在编译它时,我的编译器不同意它。

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

最佳答案

扩展我的评论:

首先,永远不要使用 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;
}

但是,如果 bar没有返回 int ,你会得到一个错误,因为隐含的 int声明与非 int 不匹配定义。
gets()返回 char * ,不是 int , 所以隐含声明 gets无论如何都是不正确的。

C99 删除了隐式 int完全声明 - 从那时起,所有函数都必须在调用之前声明或定义。

编辑

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

关于c - 为什么在 C99 中不允许隐式声明 get()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com