2013-02-13 89 views
-2

我有三個文件。你打算如何將文件包含在C項目中?

trees.h 
// a bunch of typedefs and function prototypes 
#include <trees.c> 

trees.c 
// a bunch of function bodies 

main.c 
#include <trees.h> 

這是不對的,因爲trees.c中的每個函數都給出了有關在tree.h中定義的類型的「未定義類型」錯誤。我試過了我能想到的所有配置 - 從main包含trees.c,並在trees.c中包含trees.h,在trees.h的末尾包含trees.c,並將其包含在trees.h的開頭。 。我能想到的每一個包含的組合,每個組合都給出了一組不同的錯誤。有時它是多重定義,有時它是未定義的函數...

那麼究竟是如何工作?我在哪些文件中放入了哪些文件,哪些文件包含在哪些文件中?

+1

你爲什麼在任何東西中包含'tree.c'? – Mat 2013-02-13 11:05:20

+0

預處理指令#include基本上覆制您包含在指定位置的文件的內容,包括(請參閱http://msdn.microsoft.com/zh-cn/library/36k2cdd4%28v=vs.71%29。 ASPX)。因此,你的#include 是你有這種不確定的類型錯誤的原因:他們的原型之前已經複製的功能的實現。 – JBL 2013-02-13 11:13:25

回答

1

像這樣:

trees.h 
// a bunch of typedefs and function declarations (prototypes) 

trees.c 
#include <trees.h> 
// a bunch of function definitions (bodies) 

main.c 
#include <trees.h> 

說明:

#include是基本相同拷貝整個文件包括這個文件(其中你把#include)。

因此在main.c中包含trees.h允許該文件知道trees.c中的功能。

包括trees.htrees.c允許函數在trees.c下向下爲可用並且這也是其中定義等在trees.c使用被指定。

你也可能不知道創建多個對象並鏈接它們,請參閱Joachim Pileborg的答案。

(非常醜陋的)替代方案是:

trees.h 
// a bunch of typedefs and function declarations (prototypes) 

trees.c 
#include <trees.h> 
// a bunch of function definitions (bodies) 

main.c 
#include <trees.c> 

然後你只需要編譯main。但對於幾個.c文件的任何項目,這變得不切實際。

+0

但在第一個例子,如何main.c中知道的功能trees.h的定義是?爲什麼編譯器不會只拋出某種「沒有定義的函數原型」錯誤?它怎麼說,它知道如何尋找在trees.c - 這是無處提及 - 找到那些定義? – 2013-02-13 12:24:33

+1

@JackM:在第一個例子中,編譯器不看在trees.c在編譯main.c中。編譯main.c所需要的只是原型,而不是函數體。鏈接器稍後需要函數體,這就是爲什麼您需要知道如何創建多個對象文件並將它們鏈接起來。 – 2013-02-13 12:28:53

1

您將每個源文件編譯爲目標文件,然後將這些目標文件鏈接在一起以形成最終的可執行文件。如果你使用例如GCC和命令行編譯你可以將兩個源文件中的命令行和GCC會爲您處理:

$ gcc main.c tree.c -o tree 

上面的命令告訴gcc編譯和鏈接文件main.ctree.c,並命名輸出可執行文件tree。您也可以單獨編譯源文件到目標文件,然後手動將它們鏈接在一起:

$ gcc -c main.c -o main.o 
$ gcc -c tree.c -o tree.o 
$ gcc main.o tree.o -o tree 

在上面的命令中,-c選項告訴gcc創建一個對象文件,並且-o選項告訴gcc什麼命名該對象文件。最後一個命令獲取這些目標文件並創建最終的可執行文件並將其命名(使用-o選項)tree

在源文件中,您包含所需的標題,而不是其他方式。

0

開始不包括執行(.c)文件。只包含標題(.h)文件。只要你需要在其中聲明的類型或函數,就包括它們。爲了避免多次聲明,使用include guard(無論它們是什麼 - 只是谷歌它)。

0

去是包括trees.c你的頭文件trees.h然後包括main.c中

內trees.c的方式看一看這個線程here

1

的原因,它不工作是因爲你必須使用「的extern」定義在不同的聲明的變量或函數包括文件通用的標準。您還應該將所有頭文件保存爲* .h。所以,假設你已經在tree.h中定義了結構'tree':

#include <tree.h> 

int main() { 
    extern tree; /* Get variable 'tree' declared in tree.h */ 
    extern make_tree(void); /* Get function make_tree() declared in tree.h */ 

    make_tree(); /* Call function */ 
    return (0); /* End */ 
} 
相關問題