2010-04-04 74 views
6

我有text.cpp其中包括header.h和header.cpp其中包括header.h。C++ include .h包含.cpp同名嗎?

是否也會編譯header.cpp?我在這裏接受指導,我感到非常困惑。

另外,我所問的是什麼正確的術語?我知道我聽起來像一個白癡,我很抱歉,但我無知。

哦,int main()在test.cpp中。

此外,如果header.cpp包含<iostream>,爲什麼我不能在text.cpp中使用iostream函數調用(如果包含它)?如果我在text.cpp中包含<iostream>,它會被包含在程序中兩次(換句話說,膨脹它)?

+5

你聽起來不像一個白癡。白癡不求助。 – GManNickG 2010-04-04 04:30:17

回答

4

您告訴您的編譯器要編譯哪些C++文件。 #include與它無關。

例如,如果您使用的是G ++:

g++ text.cpp // Doesn't compile header.cpp 
g++ text.cpp header.cpp // Compiles both 

(or, alternatively you can compile one file at a time and then link them) 
g++ text.cpp -o text.o 
g++ header.cpp -o header.o 
g++ text.o header.o -o your-program 

如果您使用Visual Studio和您創建了一個項目,您創建的所有C++文件會被自動編譯。

如果您既沒有使用,告訴我你的編譯器的名字,我可以告訴你確切的語法:)


現在,您的其他問題:

而且,如果header.cpp包括 iostream,爲什麼我不能使用iostream 在text.cpp中調用函數,如果它包含 ?如果我在 中包含iostream,text.cpp會將它包含在 程序中兩次(換句話說,膨脹爲 吧)?

#include告訴編譯器簡單地「複製包含文件的所有內容,並將它們粘貼到#include行所在的位置」。因此,從理論上講,你可以簡單地用記事本打開iostream,在你的.cpp文件中選擇所有,ctrl-c和ctrl-v,最終效果將完全相同=)

所以是的,它需要是包括你想使用它的每個.cpp文件,它不會「膨脹」你的程序:它只包含類定義,外部函數等。

哦,這不言而喻,但C++是一門非常龐大而困難的編程語言,你將通過一本書而​​不是一本指南來學習它。如果你不想花任何錢,一個好的免費(可下載的)C++書是Thinking in C++, Bruce Eckel。否則,如果你想買一個,你可以找到一個很好的清單here

+0

非常感謝。我會記住你的建議。 – aaron 2010-04-04 04:48:35

+1

有一個關於SO的C++書籍列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2010-04-04 05:23:05

1

header.cpp只在編譯時編譯。當你編譯test.cpp時,它不會被自動吸住。以產生正在運行的程序,也必須將得到的.o文件在一個單一的二進制鏈接,如下(簡單化):

c++ -c test.cpp 
c++ -c header.cpp 
c++ -o test test.o header.o 
0

您分別編譯每個源文件,或一起,然後連接得到的對象的模塊。

E.g.視覺C++(合)

或分開,

cl /c text.cpp 
cl /c header.cpp 
link text.obj header.obj /out:foo.exe 

要獲得的所得EXE圖像,foo.exe

而且,如果header.cpp包括 ,我爲什麼不能使用的iostream如果包含它 在text.cpp 函數調用?如果我在 中包含iostream,text.cpp會將它包含在 程序中兩次(換句話說,膨脹爲 吧)?

由於標題只包含聲明,多次包含它們沒有任何壞處。它們不會膨脹任何東西,因爲編譯器會在進行類型檢查之後將其扔掉。

但如果你對他們有類型定義,你需要的#include後衛,這樣的類型不是重新定義。