【发布时间】:2015-02-13 11:45:57
【问题描述】:
我有这个 C 编译问题。
我花了一段时间才了解问题的根本原因。 虽然,现在我已经截获了这个问题,但我不确定我是否完全低估了完整的 C 编译流程逻辑。
我有两个目录:inc 和 src
在 inc 目录中,我有一个文件:test.h 在 src 目录中,我有两个文件:test.c 和 main.c
test.c文件实现了一个函数,我们称之为test(),main.c文件调用这个test()函数。
我在 test.h 文件中声明了这个函数
现在,我只在 main.c 文件中包含了这个 test.h 文件,以便让 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 文件是否不够,以便让它“看到”函数声明,并且在链接阶段编译器会“知道”关联 test( ) main.c 文件中使用的函数要在 test.c 文件中实现吗?
我认为 test.h 文件中的 test() 函数的声明使其成为“外部”声明,因此它会通知编译器在链接阶段找到函数实现
【问题讨论】:
-
预处理器在
#include指令的位置完全包含包含文件的内容。这意味着只有包含特定头文件的源文件才会知道头文件中的声明。包含所有头文件的源文件称为translation unit,每个翻译单元或多或少是独立的。 -
即使您不在
test.c中不包含test.h导致编译失败,编译器也无法检查test()test.h中的函数原型是正确的:编译器和链接器都不会知道您是使用不正确的参数调用test(),还是使用不正确的返回值。 -
没有看到声明和定义,很难猜测出了什么问题。这可能与使用 C++ 编译器编译看似 C 程序的内容有关。为什么要这么做?为什么这个问题会被标记为两种语言?
-
请张贴(相关部分)文件,以便我们查看声明和定义。
-
只要
test.h中的test函数声明与test.c中的定义匹配,这应该可以正常编译和链接。