2012-10-23 188 views
4

头命名约定

How can I define a C function in one file, then call it from another?

说我定义文件func1.c的功能,我想从 文件call.c调用它,我将如何做到这一点?

和答案

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

我的问题是做头文件的名称必须是func1.h,在<name-of-c-file>.h,或者这仅仅是一个最好的做法?如果可能,请提供链接供参考。

回答

2

没有,头文件不需要匹配任何相应的C源文件。这正如你刚才所说的那样。

+0

您好Steve,我不知道引用链接 - #include指令在某种意义上是预处理器的独立功能。它可以用来拉入_anything_包括原始的C代码。该声明被提到的文件内容取代。所以afaik是惯例,不一定是标准(即使头文件的位置不是标准的一部分)。 HTH –

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

@Jasper,我认为最好用'a.h'来代替'c.h',用'b.h'来代替'd.h',这样gcc和make可以很容易地实现。 –

+0

@HowChen:这绝对是更好,我完全同意这一点。然而,这更好地证明了我的观点,即你可以做任何事情。 – Jasper

+0

@Jasper:我只是在开玩笑的徽章。自编辑以来,问题就出现在“最近”中,所以我正准备+1,然后看到日期。在我评论之后,我确实检查了你是否有这个想法,希望你意识到我在开玩笑。那么,那里还有一个考古学家徽章! ;) – frasnian