可以.h文件看到什麼在對方沒有被列入?我知道我什麼時候用C語言編寫程序之前,我可以在沒有#include「myfile.h」的情況下從其他.h文件的.h文件中使用變量。我試圖在C++中做同樣的事情,並且我一直得到「定義超出範圍錯誤」C++頭文件簡單問題
回答
不是直接。但是,如果.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
(或之後的任何標題#include
d)處看到錯誤。
但我不認爲這會完全回答你的問題,因爲這個過程本身不應該導致任何「定義超出範圍」的錯誤。注意發佈有問題的代碼示例?
有點? '#include' *正好*複製粘貼,直到包含文件的最後一行是否有終止換行符。 – 2009-11-17 00:23:55
@R。 Pate:是的,但它也會像添加#line指令一樣,讓編譯器知道文件和它應該在的行。但我同意強調複製和粘貼部分很重要。我會編輯。 – quark
@ R.Pate:有趣的你應該使用這個例子。在C++中,如果任何非空源文件沒有終止換行符(2.1/1/2),則程序的行爲是不確定的。 「源文件」的定義包含通常稱爲「頭文件」的內容。所以這就是它不一定等同於複製和粘貼的一個方面。不過,我想所有或幾乎所有的預處理器都是這樣實現的。如果換行符丟失,GCC會發出警告。 –
變量在.h文件是一個岌岌可危的境地,因爲當你#include
一個頭文件,它只是粘貼到您的源文件。因此,如果您的頭文件中包含int j;
並將其包含在其他源文件中,那麼您基本上只定義了幾個不同的變量,稱爲j
,當然這是一個錯誤。
不,在C或C++中都沒有。通常情況下,標題是間接包含的,這可能是您以前的經歷中可能發生的情況。
在C和C++中,除非將其加載到編譯單元(通常爲.c或.cpp文件)中,否則不會顯示任何內容,或者如果顯式聲明該內容。
,您可以轉發聲明一個變量與「外部」
extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here
舊的C編譯器可能已經對需要向前聲明更爲寬鬆。
- 1. makefile或頭文件的簡單問題?
- 2. 有關C++頭文件的簡單問題
- 3. 簡單的C++文件開口問題
- 4. 簡單的文件問題(C)
- 5. C++頭文件問題
- 6. 簡單C問題
- 7. 做一個簡單的C頭文件
- 8. C++頭文件編譯器問題(Sales_item.h)C++頭文件示例
- 9. 一個簡單的粘頭文件jQuery腳本的問題
- 10. 簡單的ASP.NET/C#問題 - 事件
- 11. 簡單的C#事件參數問題
- 12. C#NHibernate簡單問題
- 13. C++簡單線程問題
- 14. C#簡單IF或問題
- 15. 簡單的C問題
- 16. C++鏈表簡單問題
- 17. 頭文件問題
- 18. Eclipse的C + +頭和文件問題
- 19. C++頭文件變量範圍問題
- 20. C++頭文件保護問題
- 21. C++包含頭文件問題
- 22. C遞歸頭文件包含問題?
- 23. C++頭文件 - 語法問題
- 24. 基本的C++頭文件問題
- 25. C++頭文件和類定義問題
- 26. 簡單的批處理文件問題
- 27. Python:簡單文件格式化問題
- 28. 簡單的Android文件輸出問題
- 29. 簡單的web.config文件的問題asp.net
- 30. 簡單的HTML文件共享問題?
你可以重新聲明所需的變量作爲'extern'來防止這個錯誤,但我不認爲這就是你想要的 – Earlz
閱讀:http://www.learncpp.com/cpp-tutorial/19-header -files/ – Secko