2013-03-26 44 views
-2

所以我有2個文件,我需要打開的,叫他們:example.cc和example.h文件編程分配說測試程序將只包含.H文件,而不是.CC文件。有人可以澄清

我們被告知,他們的測試代碼將只的#include「example.h文件」

通常我總是使用#include「example.cc」,因爲這將在其聲明中包含example.h。

當我運行測試代碼時,我只是簡單地得到「未定義的參考示例::示例..」任何時候我在測試代碼中提到的例子,這顯然是因爲測試代碼只能看到我在example.h中的解除,而不是他們的實際實施。

我錯過了什麼?我已經在example.h中嘗試了#include example.cc,但是這顯然是不正確的。

+0

你能告訴我們您正在使用至極的編譯器/環境? – 2013-03-26 18:20:31

+0

我正在使用g ++編譯 – pledgehollywood 2013-03-26 18:24:21

+0

你確定他們不希望** lib **與該頭文件一起使用? – WhozCraig 2013-03-26 18:25:50

回答

3

這很可能是你的教授有某種其他的文件,說professor_main.cc,他們會編寫這樣的項目:

g++ example.cc professor_main.cc -o project 

他們professor_main.cc將有一個線

#include "example.h" 

,它也將使用一些你的功能,並有可能測試他們正在做正確的事:

std::cout << (example_add(2,3) == 5) ? "good" : "bad" << std::endl; 

現在,如果他們沒有#include example.h,或者如果你沒有正確創建這個文件,他們會在professor_main.cc上得到一個編譯錯誤,因爲它不知道example_add(int,int) 。應該在頭文件中並導致此錯誤消失的關鍵行是:

int example_add(int a, int b); 

這稱爲函數聲明。

如果一切與頭做得正確,但你的教授犯了一個錯誤,並試圖編譯該項目沒有example.cc,像這樣:

g++ professor_main.cc -o project 

然後,他們會得到一個連接誤差約一對example_add()的「未定義參考」。

現在缺少的是功能定義

int example_add(int a, int b) { return a + b; } 

這應該是在你的example.cc文件,如果教授包括他們的編譯命令行上,都應該很好。

但是,如果您在標頭文件中執行了#include「example.cc」,則一切都會不正常。實際上,你將複製並粘貼example.cc到professor_main.cc中,因爲它包含在那裏。但它顯然仍然在它自己的文件example.cc中。所以,如果你的教授試圖做到這一點:

g++ example.cc professor_main.cc -o project 

他們會從鏈接獲得多個定義錯誤,因爲函數example_add()將已經定義兩次

一般,那麼,你很可能應該做的是把所有的功能定義在源文件(.cc的),您的所有功能聲明在你的頭文件(.h)中。嘗試自己編譯另一個.cc文件,並試驗看看它是如何工作的。

1

在C++(和C,從該下降)的想法是,文件(*.h在C,在C++中沒有擴展名)包含聲明(沒有可執行代碼,除了內聯函數),而代碼文件( *.c in C, * .CC in C++) contain all executable code, and#include`該聲明他們需要的頭文件。需要注意的是執行一些時髦類廣泛使用的文件也應包括在聲明的頭,以避免很難追查由於不同的申報錯誤。

C/C++預處理器是一個愚蠢的野獸,它只是取代文本,而#include只是逐字拷貝文件的內容,所以你可以做各種奇怪的扭曲,比如starti在#incude d文件中的語句ind完成它,或在頭中包含可執行代碼。我會編,做工精細,但真正重要的是,如果在未來的人類閱讀代碼的理解它(我的意思是你幾天)。你的TA將不會從你的組織混亂的代碼受苦,她只會皺她的鼻子,給你一個F. 會,而試圖得到它的工作。

什麼,他們大概的意思是,你應該執行,說class foo,給予所需的聲明使用class foo在頭文件foo.h(和什麼未洗的羣衆應該怎麼看class foo作品!),和一個代碼文件foo.cc給出了實際的實現;他們將提供bar-uses-foo.cc其中包括foo.hfoo.o的鏈接來測試你的班級。

0

您需要使用您的編譯器鏈接的文件,然後構建它們。另一件事情是除了頭文件之外的每個文件中,都需要包含頭文件。

這樣的事情應該幫助

gcc -c example.c -o example.o 
gcc example.o -o example 

如果您添加使用頭另一個文件:

gcc -c file1.c -o file1.o 
gcc -c file2.c -o file2.o 
gcc file1.o file2.o -o myprogram 

條款gccg++都是Linux和Unix編譯器。 如果您使用的是Windows開發的C++應該工作或使用gcc for windows

相關問題