gpt4 book ai didi

c - C 中意外的函数原型(prototype)行为

转载 作者:行者123 更新时间:2023-12-01 11:49:31 25 4
gpt4 key购买 nike

我在学习 K & R 的 C 语言时,在本书的第 4.4 部分 中提到作用域规则时感到困惑。在我继续之前,让我先发布我正在处理的源文件。

#include <stdio.h>

void first(void);

int main(void) {
printf("In main.\n");

first();
second();

return 0;
}

void first(void) {
printf("In first.\n");
}

void second(void) {
printf("In second.\n");
}

现在,除非我比我想象的更愚蠢,否则这本书给了我函数原型(prototype)(在与函数定义相同的文件中)出于范围原因而存在的想法。也就是说,它们的存在是为了允许在编译文件的顶部声明函数,以便通知源文件的其余部分存在“对象”/strong> 如果我可以这样调用它,请提前。

我对上述代码的问题是,在我正在使用 GCC version 4.7.1 的 Arch Linux 虚拟机中,上述文件可以NOT编译并给出以下错误:conflicting types for second

然而,当非常相同的代码运行到我的物理机器上时,运行 Ubuntu 12.04GCC 4.6.3 版 它只编译很好。

我的问题是:这是编译器功能吗?因为如果不是,我很惊讶它能编译,因为没有 second 的函数原型(prototype), main(如果我理解正确的话)应该无法知道 second 的存在。

最佳答案

出现“冲突类型”错误消息是因为大多数 C 编译器在遇到尚未声明的函数时,会隐式声明该函数的原型(prototype)并返回一个 int。因此,当 main() 中遇到 second() 时,GCC 4.7.1 会推断以下定义:

int second();

然后,当编译器到达函数定义时,注意到推断原型(prototype)的签名与定义的签名不匹配,并因错误而中止。

至于4.6.3为什么能成功编译这段代码,以下是猜测。 GCC 4.6.3 可能有一些错误(或功能,您决定)允许函数实现通过返回类型与其原型(prototype)不同。由于 C 允许具有非 void 返回类型的函数在不返回任何内容的情况下终止(这使得它们的返回值未定义),这可能只是两个次优事物相互抵消的情况。

(4.6.3 中的行为也可能是版本之间默认编译器选项的更改,或者您正在调用具有不同选项的编译器。)

关于c - C 中意外的函数原型(prototype)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804908/

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