2012-10-23 118 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