gpt4 book ai didi

c++ - 头文件与源文件中的外部函数

转载 作者:行者123 更新时间:2023-11-28 06:26:09 25 4
gpt4 key购买 nike

我有这个 C 编译问题。

我花了一段时间才了解问题的根本原因。虽然现在我已经截获了这个问题,但我不确定我是否完全低估了完整的 C 编译流程逻辑。

我有两个目录:inc 和 src

在 inc 目录中我有一个文件:test.h在 src 目录中,我有两个文件:test.c 和 main.c

test.c文件实现了一个函数,暂且称之为test(),main.c文件调用这个test()函数。

我在test.h文件中声明了这个函数

现在,我只将这个 test.h 文件包含在 main.c 文件中,以便让 main.c 文件“看到”test() 函数的声明。

编译时:

g++ -o test.o -c test.c
g++ -o main.o -c main.c
g++ -o test test.o main.o

在最后一条命令中,我收到“未定义对‘test’的引用”的错误

调试后发现test.c文件中缺少test.h文件的include解决了这个问题。

换句话说,我需要在两个源文件——main.c 和 test.c 中包含 test.h 文件

我的问题是,为什么?仅仅在main.c文件中包含头文件、test.h文件是否不够,为了让它“看到”函数声明,并且在链接阶段编译器会“知道”关联测试( ) 函数在 main.c 文件中使用到它在 test.c 文件中的实现?

我认为test.h文件中test()函数的声明使其成为“外部”声明,因此它会通知编译器在链接阶段找到函数实现

最佳答案

问题是因为您的原型(prototype)与实现不匹配。

如果您使用 C 编译器,由于错误的参数和返回值处理,您会遇到有趣的运行时错误,因为生成的符号通常不包含参数信息。

在 C++ 中,编译器生成一个依赖于参数类型的方法签名。因此,具有相同名称但不同参数的两个函数将产生两个不同的符号,因此链接器不会混淆它们。

所以修复你的原型(prototype),它会工作......

关于c++ - 头文件与源文件中的外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28498881/

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