2013-04-25 182 views
0

我一直想知道編譯> 1000行代碼的項目的最佳方法。關於編制項目的最佳方式,我只是有一些基本問題。我使用GCC,如果它有所作爲。我的問題是:關於彙編的問題

  • 在多個源文件中包含庫是否會導致函數被複制兩次?

我的意思是,如果我有兩個文件是這樣的:

Souce.c

#include<stdio.h> 
... 
void static test_func(){ printf("Hey!"); } 

Source2.c

#include<stdio.h> 
... 
void static test_func(){ printf("Hey!"); } 

請問功能,printf的,得到複製到可執行文件兩次?我想我想避免這種情況,因爲很多時候我會有多個源文件共享相同的頭文件,我想知道這是不是一個壞習慣。

有一次,我只包括使用這種其他的源文件:

由source.c

#include<stdio.h> 
#include "source2.c" 

但我不知道如果這,還有,是一個不好的做法與否。這導致我到另一個問題:

  • 是否包括源文件一個不好的做法?

注意:通過不好的做法,我的意思是如果某件事情是違背約定或導致某種低效率。

編輯:我剛剛讀過,圖書館之間共享的文件。我的客人,這意味着我的第一個問題的答案是否定的。然而,如果包含使用預處理器的源文件是普遍的做法,我很好奇。

回答

1

注意,像stdio.h庫的頭文件僅包含聲明printf函數的動態庫文件;它們不包含那些函數的實際代碼。當所有目標文件和相關庫被組合起來形成最終的可執行文件時,在鏈接時添加printf等功能的實際代碼。

包括你的例子中的源文件,通常被認爲是不好的做法,雖然可能有特定的用例;我不能想到任何好的東西。您發生重複定義錯誤的風險更高,並且您不必要地重建代碼。編譯器可能會限制它在一次會議中可以消化多少代碼;包括包含源文件的源文件的源文件可能會導致構建時間過長或更糟糕。已經有一段時間了,但是我看到編譯器會在非常大的文件上窒息,特別是如果你想優化輸出。 (通常)不需要重建整個項目(當然,這取決於被更改的內容);如果我只改變一個文件中的某些內容,我通常不需要重建整個項目。我只需重新編譯一個文件並重新鏈接即可。

1

靜態鏈接期間庫函數僅包含一次。如果庫是動態的,則根本不添加副本,只有動態鏈接信息。

包括.c文件很奇怪,除非你有特定的理由這樣做。其中一個原因是外部模塊測試程序,其中根本不需要模塊中的main函數,但同時爲了正確測試它,main需要訪問所有文件靜態無法通過不同文件訪問的數據。

1

不包括跨文件庫多次不會使它包含在最終的可執行多次

鏈接器負責解決的功能,當它發現它已經知道的功能,它已經包含了它不會嘗試再次將其包含在靜態鏈接中。鏈接程序將確保它僅包含包含靜態鏈接中特定定義的必需文件。

在動態鏈接,鏈接器將加載所需要通過在運行時應用到存儲器