我知道這在大多數語言中很常見,也可能在C語言中。 C可以將幾個函數分開處理成一個單獨的文件並將它們包含在內?將一組函數分解爲C中的包含文件?
函數也將依賴於其他包含文件。我希望代碼保留所有功能,但代碼將在幾個C腳本中重複使用,如果一旦我不希望必須通過每個腳本並在其中進行更改,則我將其更改。
我知道這在大多數語言中很常見,也可能在C語言中。 C可以將幾個函數分開處理成一個單獨的文件並將它們包含在內?將一組函數分解爲C中的包含文件?
函數也將依賴於其他包含文件。我希望代碼保留所有功能,但代碼將在幾個C腳本中重複使用,如果一旦我不希望必須通過每個腳本並在其中進行更改,則我將其更改。
在頭文件中聲明函數,然後在.c文件中實現它們。現在,您可以將頭文件轉換爲使用函數的任何程序,然後將該程序與從.c文件生成的目標文件鏈接起來。
說你有,你想在其他地方使用功能的文件:
int func2(int x){
/*do some stuff */
return 0;
}
你會做什麼是拆分此成一個頭文件和源文件。在頭文件中你只有函數聲明,這告訴編譯器該函數確實存在,即使它在不同的文件中。頭可以被稱爲func2.h可能是這樣的:
#ifndef HEADER_FUNC2_H
#define HEADER_FUNC2_H
int func2(int x);
#endif /*HEADER_FUNC2_H*/
的的#ifndef HEADER_FUNC2_H部分是確保讓沒有多重定義正在進行這僅被使用一次。 然後在源文件func2.c你有實際功能的本身:
int func2(int x){
/*do some stuff */
return 0;
}
和現在的任何其他文件,您使用FUNC2你必須包含頭文件。你用#include「func2.h」來做到這一點。因此,例如,如果我們想從randomfile.c它會是這樣叫FUNC2:
#include "func2.h"
/* rest of randomfile.c */
func2(1);
那麼最後一步是鏈接包含與編譯器的功能在編譯對象文件。
絕對是!你所描述的是頭文件。你可以閱讀更多關於這個過程here,但我會概述下面的基礎知識。
你有你的功能分成稱爲functions.h
一個頭文件,它包含以下內容:
int return_ten();
然後你就可以有一個functions.c
文件,其中包含了函數的定義:
int return_ten()
{
return 10;
}
然後在您的main.c
文件中,您可以按以下方式包含functions.h
:
#include <stdio.h>
#include "functions.h"
int main(int argc, char *argv[])
{
printf("The number you're thinking of is %d\n", return_ten());
return 0;
}
這是假設你functions.h
文件在同一目錄中main.c
文件。
最後,當你想編譯成目標文件中這一點,你需要將它們連接在一起。假設你使用的是命令行編譯器,這只是將額外的定義文件添加到最後。爲了使上述代碼正常工作,您需要在cmd中輸入以下內容:gcc main.c functions.c
這會產生一個可以運行的a.out文件。
如果您想在多個程序中重用函數,您應該將它們放在一個庫中,並將它與其餘的代碼鏈接起來。
如果你想共享相同的定義(如宏,類型......),你可以將它們放置在頭文件,包括他們#include
。
請避免將「#include」函數代碼直接放入源文件中,這是一種不好的做法,可能會導致非常有問題的情況(尤其是如果您是初學者,就像您的標記所暗示的那樣)。通常當你有一組功能,你想分享和重用
Consder,您將需要兩個!您通常會得到一個myfuncs.lib
(或libmyfuncs.a
)庫和一個myfuncs.h
標頭。
在你想重用現有功能的程序,你將包括標題和鏈接對庫。
您還可以查看一旦掌握了靜態庫的使用情況,如何使用動態庫。
-1:y您不應將定義放在標題中。如果您多次包含它,則會因符號重新定義而出現錯誤。 – 2010-06-01 13:53:18
謝謝。清理起來了。 – KushalP 2010-06-01 13:57:51
@Bastien:許多圖書館只有標題。 – Lucas 2010-06-01 14:00:53