这
How can I define a C function in one file, then call it from another?
假设我在文件
func1.c
中定义了一个函数,我想从中调用它 文件call.c
,我将如何实现这一目标?
和答案
您可以在文件
func1.h
中放置该函数的声明,然后添加#include "func1.h"
中的call.c
。然后你会编译或链接func1.c
和call.c
在一起(详情取决于哪个C系统)。
我的问题是头文件的名称是否必须 func1.h
,如<name-of-c-file>.h
,或者这只是最佳做法?如果可能,请提供参考链接。
答案 0 :(得分:4)
在c
中,您根本不需要调用任何文件。因此,您可以在调用源文件mylongheadername.h
时调用标题a.c
,并在其中调用名为justArandomFunctionName
的函数。
但是,您应该知道源文件需要包含头文件。通常,标头和源文件之间存在强大的联系,因此这就是以这种方式总是这样做的原因。但是,以下内容完全有效:
a.c : func1 implementation
func2 implementation
b.c : func3 implementation
func4 implementation
c.h : func1 declaration
func3 declaration
d.h : func2 declaration
func4 declaration
但是,当使用这样设置的文件时,这种方法可能会出现一些问题(这意味着你需要额外的工作来正确地构建这些文件),这只是不好的做法。但是,使用头文件的方式只是惯例,几乎没有任何一种是由语言强制执行的。
如果头文件不知道定义函数的位置,那么问题是如何工作的。这个想法是它不需要知道。
基本上,你的所有标题都告诉你的编译器你定义了一个适合某个配置文件的函数(什么名称,什么参数,返回类型)。当您的编译器读取它时,它基本上所做的就是将所有这些信息混合到一个花哨的名称中,然后它将插入到正在调用的文件中,这意味着它仍然没有做任何事情。您需要采取的下一步是使用链接器将每个文件的编译版本转换为单个可执行文件。这做了很多事情,但最重要的是它解析了编译器编写的所有那些花哨的名字。但是,链接器执行此操作的方式是,它只读取文件的所有已编译版本,并将函数的定义与其他代码中的实际位置相匹配。因为它只是同时处理你所拥有的所有东西,所以你的函数定义在哪里并且头文件永远不需要知道这一点并不重要。
答案 1 :(得分:2)
不,头文件不需要匹配任何相应的C源文件。就像你刚才所说的那样。