2010-09-16 69 views
1

爲什麼有些人在頭文件中寫方法?頭文件中的方法

在過程文件和頭文件中編寫方法有什麼區別?

下面的代碼:

Work.h

#include <time.h> 

void DoWork(int n) 
{ 
    clock_t t = clock() + n * CLOCKS_PER_SEC/1000; 
    while(clock() < t); 
} 

Program.c

#include <stdio.h> 
#include "work.h" 
int main(void) 
{ 
    printf("Starting work\n"); 
    DoWork(100); 
    printf("Work has finished\n"); 
} 

是否有一個程序文件和頭寫的方法有什麼區別文件還是相同?

編輯1:我知道的唯一區別是如果我在過程文件中編寫DoWork(),那麼我必須在編譯主程序時編譯過程文件,然後傳遞目標代碼。

謝謝。

+1

這是一件壞事,在'C'做。不過,我相信這在'C++'中很常見。 – pmg 2010-09-16 10:18:04

+0

@pmg你能告訴我,爲什麼它不好?是否有任何性能問題或任何其他問題? – Searock 2010-09-16 10:19:56

+0

@pmg:通常在C++中將'inline'函數放入頭文件中。使用非'inline'函數它和C一樣糟糕。(但是,請注意,類成員函數不僅在_declared_中,而且在它們類的定義中_defined_也被隱式地內聯。) – sbi 2010-09-16 10:20:06

回答

3

預處理器將 - 除其他外 - 遞歸地用所包含的這些頭代碼遞歸替換所有#include指令。 (基本上,這是一個愚蠢的文本替換機器。)結果,所有包含的頭文件被遞歸複製到它的源文件稱爲翻譯單元。實際上,這就是您的編譯器所看到的(儘管現代編譯器通常會將翻譯過程的不同階段組合在一起以便更快速地進行)。
您可以讓多個翻譯單元參與單個生成的程序。 (事實上​​,有超過50行代碼任何東西,那是相當多的標準。)

當你定義頁眉功能(而不是隻聲明),並且把這些定義的標題是然後包含在多個要鏈接到某個可執行文件的源文件中,那麼鏈接程序將找到相同函數的多個定義,並放棄發送一個令人討厭的錯誤消息。

+0

你的意思是說,DoWork將被添加到主程序,然後編譯? – Searock 2010-09-16 10:27:13

+0

@Searock:不,我的意思正是我所說的:當頭被包含在幾個翻譯單元中時(它們可能是從你的'Program.c'創建的),它們最終都會有他們自己定義的'DoWork ()'。但是,定義只能在程序中出現一次,程序可能包含多個翻譯單元。 – sbi 2010-09-16 10:32:44

+0

@Searock,看看[這個答案](http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-claclaration/1410632#1410632),它解釋聲明和定義之間的區別。答案是C++,C和C++之間有一些細微的差別(除了C++有類之外),但其基本原理是相同的。 – sbi 2010-09-16 10:34:23

1

這一切歸結爲「項目管理」。

在每個項目中,所有功能都必須唯一地命名爲(儘管有例外),以便鏈接器可以通過調用正確的函數來完成程序。

在一個小型項目中(比如上面的「工作」項目),很容易看出代碼沒有重複,但隨着時間的推移和項目的增長,管理難度加大。如果你的幾個'.c'文件#include "work.h",他們每個人都會得到函數定義DoWork的副本。如果你把函數定義放在一個'.c'文件中,或者它是一個'.h'文件中的一個聲明,那麼就不會有錯誤。

函數聲明:告訴編譯器如何使用功能
功能definiton:告訴編譯器的功能是什麼

相關問題