2009-11-17 79 views
0

可以.h文件看到什麼在對方沒有被列入?我知道我什麼時候用C語言編寫程序之前,我可以在沒有#include「myfile.h」的情況下從其他.h文件的.h文件中使用變量。我試圖在C++中做同樣的事情,並且我一直得到「定義超出範圍錯誤」C++頭文件簡單問題

+0

你可以重新聲明所需的變量作爲'extern'來防止這個錯誤,但我不認爲這就是你想要的 – Earlz

+1

閱讀:http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko

回答

2

不是直接。但是,如果.cc.c文件#include是一個文件,那麼它之後的任何頭文件將會看到該頭文件的內容。原因是#include的行爲就像複製粘貼:每個文件內容都被有效地轉儲到一個大文件中,編譯器只能看到合併後的結果。例如,如果您有:

foo.cc:

#include <a.h> 
#include <b.h> 
#include <c.h> 

// foo.cc's contents 

即使b.h#include a.h,其定義將仍然處於BH可見,因爲編譯器看到的所有內容頭像好像他們是foo.cc的一部分。這在實踐中可能相當成問題,因爲程序依賴於它們沒有明確包含的定義。當某人更改a.h時,您可以開始在b.h(或之後的任何標題#included)處看到錯誤。

但我不認爲這會完全回答你的問題,因爲這個過程本身不應該導致任何「定義超出範圍」的錯誤。注意發佈有問題的代碼示例?

+0

有點? '#include' *正好*複製粘貼,直到包含文件的最後一行是否有終止換行符。 – 2009-11-17 00:23:55

+0

@R。 Pate:是的,但它也會像添加#line指令一樣,讓編譯器知道文件和它應該在的行。但我同意強調複製和粘貼部分很重要。我會編輯。 – quark

+1

@ R.Pate:有趣的你應該使用這個例子。在C++中,如果任何非空源文件沒有終止換行符(2.1/1/2),則程序的行爲是不確定的。 「源文件」的定義包含通常稱爲「頭文件」的內容。所以這就是它不一定等同於複製和粘貼的一個方面。不過,我想所有或幾乎所有的預處理器都是這樣實現的。如果換行符丟失,GCC會發出警告。 –

0

變量在.h文件是一個岌岌可危的境地,因爲當你#include一個頭文件,它只是粘貼到您的源文件。因此,如果您的頭文件中包含int j;並將其包含在其他源文件中,那麼您基本上只定義了幾個不同的變量,稱爲j,當然這是一個錯誤。

0

不,在C或C++中都沒有。通常情況下,標題是間接包含的,這可能是您以前的經歷中可能發生的情況。

0

在C和C++中,除非將其加載到編譯單元(通常爲.c或.cpp文件)中,否則不會顯示任何內容,或者如果顯式聲明該內容。

,您可以轉發聲明一個變量與「外部」

extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here 

舊的C編譯器可能已經對需要向前聲明更爲寬鬆。