2011-07-29 49 views
2

可以說我有3個文件:add.h,add.cpp和main.cpp。這是C++培訓網站上的常見示例,其中add.h包含名爲「add」的函數的原型。 Add.cpp包含原型的聲明,main.cpp包含add.h,然後調用add()函數將兩個數字(x和y)一起添加。有關C++頭文件的簡單問題

我的問題是這樣的:不管是什麼我的名字add.cpp,我的程序工作得很好。 Elephant.cpp和doctorWhoRules.cpp一樣工作。編譯器是否搜索所有本地.cpp文件以在add.h中查找給定的原型?我沒有聲明包含它的.cpp文件的名稱。我只是困惑於這是如何工作的。

謝謝!

+2

哪個編譯器/你在用IDE嗎? 底下,這實際上是一個依賴管理工具的工作,也許有一個Makefile或類似的東西 – KarlM

+0

你在編譯這個? –

+1

來自Java的背景,呃?從1999年開始授權程序員:-)順便說一句,你的'add.cpp'不會「聲明原型」(頭部已經這樣做),而是*定義了函數*。 –

回答

2

我覺得你與C++混合Java。在Java(像Eclipse這樣的編輯器)中,一般的限制是,你的名字應該和文件名相同。即

// Add.java 
class Add 
{ 
} 

在C++中沒有這樣的限制。您的文件名可以是任何有意義的名稱。你要照顧的唯一的事情就是你的執行文件與.cpp/.cxx/.C等擴展(我不知道現代編譯比這支持其他的也可以)。

即使你的頭文件,當然可以比.cpp和所有其他的任意延伸;頭文件的更常規擴展名是.h,.hpp等。

+0

這是正確的,.h或.r或其他任何對頭文件都適用的。我記得當我讀到「面向對象編程盯着ANSI C」時,這讓我很困惑,它使用了一種瘋狂的自我約定。 – Ziggy

2

這些名稱是一種約定。你可以任意命名,包括「weekly.newsletter」。你不必使用「add.cpp」。

這就是說,它是明智的做法是遵循慣例,除非你有充分的理由不,有些工具將使用擴展來推斷所使用的語言。

作爲一個例子,它是當人們使用「foo.cpp」文件,就好像它們是頭文件一樣,這會引起混淆!但是,這在C++中是允許的。然而,這是違反慣例的,編程很困難。

1

查看以上答案的文件名。鏈接器收集目標文件,匹配代碼等並構建您的可執行文件。

1

不同的可能性;

1)你是不是真正重命名文件,你只是保存在新名稱的文件 - 和老add.cpp仍然存在,仍然有效。

2)有一個古老的add.obj遊逛,這是什麼是越來越鏈接

3)的文件是openeds作爲項目和視覺工作室計算出打開的文件確實是所有的文件你想編譯進去並執行

1

是的,編譯器搜索所有的文件。更確切地說,它只執行一次(「編譯」),將代碼減少爲機器指令,併爲每個文件添加一個全局定義的符號列表(函數和變量名稱),然後進行第二遍(「鏈接」,技術上不是根本就是編譯器的一部分),它們將這些名稱相互匹配。

原型在點。h文件只是爲了讓編譯器在編譯main.cpp時提供實際在add.cpp中定義的確切類型和名稱(或者任何你稱之爲的)。這使得編譯部分無需真正看到實現文件就可以完成。但是,因爲編譯器需要在編譯期間看到模板的完整定義,因爲它必須根據模板的調用方式生成類特定的代碼,所以模板會破壞這種「單獨編譯」模型。通常情況下,模板會放入.h文件並隨處包含。

0

假設我們有add.h add.cpp和main.cpp。

您需要添加main.cpp和add.cpp的原型。 main.cpp需要它,因爲它想使用類add和add.cpp需要它,因爲它想要實現它,因此需要它的原型。這是通過包含頭文件來完成的。 在add.cpp和main.cpp中都做#include「add.h」。

現在編譯器開始生成兩個對象文件,即main.o和add.o.所以仍然主要只知道添加,內部機制(實現)仍然不存在。之後,鏈接器將main.o和add.o合併到一個可執行文件中,該文件具有從main添加的所有鈴聲和哨聲。

編譯完每個目標文件後都知道名字。鏈接之後,他們實際上知道如何通過名稱(他在哪裏(實現)所在的位置調用它們)。

在編譯器之前,我們有另一個叫做預處理的步驟,其中一個步驟是複製#include後的文件內容

不管你怎麼調用add.h都沒關係,但是你必須在main.cpp和add.cpp中包含正確的文件,不管你怎麼調用add。 cpp或者main.cpp無關緊要,只有你的編譯器必須被告知它們是如何被調用的,例如在Visual Studio中,這是通過在你的項目文件中重命名來自動完成的,如果使用gcc,你必須指示你的編譯器,你自己做鏈接器,在這個特定的情況下,你可以做以下事情:

編譯add.cpp到add.o:

gcc -c add.cpp 

編譯main.cpp中到main.cpp中:

gcc -c main.cpp 

鏈接add.o和main.o成myniceprogram:

gcc -o myniceprogram add.o main.o