标头命名约定

5 c header-files

如何在一个文件中定义C函数,然后从另一个文件中调用它?

假设我在文件中定义了一个函数func1.c,并且想从文件中调用它call.c,我将如何实现呢?

和答案

你会放一个声明文件中的函数func1.h,并添加 #include "func1.h"call.c。然后,你会编译或链接func1.ccall.c在一起(细节取决于其空调系统上)。

我的问题是头文件的名称是否必须为 func1.h,如中所述<name-of-c-file>.h,或者这仅仅是最佳实践?请提供链接以供参考。

Jas*_*per 5

在 中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
Run Code Online (Sandbox Code Playgroud)

但是,在使用这样设置的文件时,这种方法可能会出现一些问题(这意味着您必须付出额外的工作来正确构建这些文件),这只是一种糟糕的做法。但是,人们使用头文件的方式只是约定俗成的,几乎没有任何一种是由语言强制执行的。


那么问题来了,如果头文件不知道函数在哪里定义,这将如何工作。这个想法是它不需要知道。

基本上,您的头文件所做的就是告诉编译器您在某处定义了一个适合特定配置文件的函数(什么名称、什么参数、什么返回类型)。当您的编译器读取此内容时,基本上它所做的就是将所有这些信息混合成一个花哨的名称,然后将其插入到正在调用的文件中,这意味着它仍然不执行任何操作。您需要采取的下一步是使用链接器将每个文件的编译版本转换为单个可执行文件。这做了很多事情,但最重要的事情之一是它解析了编译器编造的所有那些花哨的名字。但是,链接器执行此操作的方式是,它仅读取文件的所有编译版本,并将函数定义与其在其他代码中的实际位置相匹配。


Kyl*_*ton 2

不,头文件不需要匹配任何相应的 C 源文件。正如你所说,这只是惯例。