有一个函数f中foo.c,我把f Prototypes成一个头文件.
然后,有3个问题:
foo.h?foo.c和foo.h必须在同一个目录 ?f.h,foo.c并且f.h可以在不同的目录中.看一个例子:〜/的CFile/foo.c的
#include "~/hfile/f.h"
int f(void){
...
}
Run Code Online (Sandbox Code Playgroud)
〜/ HFILE/FH
int f(void);
Run Code Online (Sandbox Code Playgroud)
〜/主/ cmain.c
#include "~/hfile/f.h"
int main(void){
f();
...
}
Run Code Online (Sandbox Code Playgroud)
然后,当我f在cmain.c中调用函数时,cmain.c可以 通过指令找到fh#include,但cmain.c如何通过fh找到foo.c,因为cmain.c只包含fh 而不包含foo.c?或编译器或链接器如何通过fh找到foo.c?
头文件必须命名为foo.h吗?
不,但使用将程序的相关部分联系在一起的名称(即使它是结构性联系,而不是逻辑联系)是一件非常合理的事情.请记住,代码/源代码树适用于人类,而不是机器.
foo.c和foo.h必须在同一目录中
不可以.但必须正确设置包含路径,以便foo.c构建.
但编译器或链接器如何找到foo.c并从foo.c调用f?
您必须为编译器/链接器指定这些内容.查阅他们的文档.由于为大型项目执行此操作可能有点令人生畏,因此甚至可以根据您指定的规则为您管理构建.一个经典的例子是该make计划.
至于你添加的代码示例.简单地包含标题并不足以构建程序.标头仅包含声明.您必须指示链接器获取相关的目标文件并将它们链接到单个可执行文件中.
想想是否作为拼图游戏.每个声明都在一个具有特定形状的目标文件中.每个函数定义都是具有特定形状的目标文件中的碰撞.链接器的工作就是像将拼图放在一起时那样适应凹痕.