从
假设我在文件中定义了一个函数
func1.c
,并且我想从文件中调用它call.c
,我将如何做到这一点?
和答案
您将在文件中声明该函数,
func1.h
然后添加#include "func1.h"
。call.c
然后你将编译或链接func1.c
在一起call.c
(细节取决于哪个 C 系统)。
我的问题是头文件的名称是否必须是 func1.h
,如<name-of-c-file>.h
,或者这只是一个最佳实践?如果可能,请提供链接以供参考。
从
假设我在文件中定义了一个函数
func1.c
,并且我想从文件中调用它call.c
,我将如何做到这一点?
和答案
您将在文件中声明该函数,
func1.h
然后添加#include "func1.h"
。call.c
然后你将编译或链接func1.c
在一起call.c
(细节取决于哪个 C 系统)。
我的问题是头文件的名称是否必须是 func1.h
,如<name-of-c-file>.h
,或者这只是一个最佳实践?如果可能,请提供链接以供参考。
在c
中,您根本不需要调用您的文件。因此,您可以调用 header 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
但是,在使用这样设置的文件时,这种方法可能会出现一些问题(这意味着您必须在正确构建这些文件时投入额外的工作),而且这是一种糟糕的做法。但是,使用头文件的方式只是约定,几乎没有任何一种是由语言强制执行的。
然后是一个问题,如果头文件不知道函数的定义位置,这将如何工作。这个想法是它不需要知道。
基本上,你的头文件所做的只是告诉你的编译器你在某个地方定义了一个适合特定配置文件的函数(什么名称,什么参数,什么返回类型)。当您的编译器读取此内容时,基本上它所做的只是将所有这些信息混合成一个花哨的名称,然后它将插入到正在调用的文件中,这意味着它仍然不做任何事情。您需要采取的下一步是使用链接器将每个文件的编译版本转换为单个可执行文件。这做了很多事情,但最重要的事情之一是它解析了编译器编造的所有那些花哨的名字。但是,链接器执行此操作的方式是它只读取文件的所有编译版本,并将函数的定义与它们在其他代码中的实际位置相匹配。
不,头文件不需要匹配任何相应的 C 源文件。正如你所说,只是约定。