我正在閱讀一本C++書(C++ primer),現在有一件我無法弄清楚的東西。
爲什麼如果我有2個不同的cpp文件,並且我聲明&在這些文件中定義了一個具有相同名稱的變量,編譯器會給我一個鏈接錯誤?文件的變量是本地的嗎?C++關於變量
C++關於變量
回答
變量本地文件?編號
與h文件相反,cpp文件沒有特別的特別之處;當你編譯一個cpp文件(比如說,以標準的方式,到一個.o)時,引入h文件的#include
只是簡單地將h文件注入到編譯流中。這方面的頭文件是組織實體。
您可以將int foo;
放在一個cpp文件中,extern int foo;
放在另一個文件中,將每個文件編譯爲一個目標文件並將它們鏈接在一起。第二個文件然後可以訪問第一個文件中的同一個對象(extern int foo;
被推入到cpp文件中的事實實際上並不相關)。出於同樣的原因,將int foo;
放置在兩個不同的cpp文件中時,將它們鏈接在一起時會產生歧義。
爲了確保INT FOO在一個轉換單元(編譯的.o/obj文件,如果你會)真的只由單位,你可以做兩件事情之一:
- 聲明foo對象是靜態的,如下所示:
static int foo;
這個變量不受外部鏈接影響;它對一個翻譯單位來說是真正的私人。 把int對象在具名命名空間,如下所示:
namespace { // Foo is in a unique namespace for this object file int foo; }
這種特殊的構建體產生用於每個轉換單元唯一的命名空間。這會導致跨目標文件的每個foo對象都是不同的。
謝謝!很好的解釋。所以.h文件的目的是告訴編譯器哪些方法/函數/其他東西在其他.cpp中,然後讓你在你想要的任何.cpp中使用它們,對吧? – 2014-09-06 19:32:55
不完全。 cpp中的代碼和h中的代碼看起來與編譯器相同,並且處理方式相同。 h文件仍然是你放置共同實體的地方;在這種情況下,聲明 - 'extern int foo;'。這樣,任何想在您的cpp文件中使用int的人都可以#包含您的h文件,並將'extern int foo;'注入到它們的代碼中。這是爲了您的利益,而不是編譯器。 – 2014-09-06 19:46:37
如果用static
關鍵字聲明變量,它們將是相應編譯單元的本地變量,並且不會收到錯誤。否則,它們是全球性的,應該可以訪問整個程序,因此會產生錯誤。
- 1. 關於變量
- 2. 關於傳遞變量用C
- 3. 關於一個具體的C變量
- 4. 關於C++的條件變量
- 5. 關於Blogger變量定義
- 6. 關於變量和選擇
- 7. 問題關於javascript變量
- 8. 關於變量的範圍?
- 9. 關於DOM的變量
- 10. 關於PATH變量UNIX
- 11. 關於變量的語法
- 12. 關於VB6 - 環境變量
- 13. Python - 關於變量聲明
- 14. 關於變量名稱
- 15. 關於PHP $ _SESSION變量
- 16. 關於變量的MYSQL
- 17. 關於全局變量
- 18. 有關的變量在C#
- 19. 關於變量範圍的C/C++編譯器優化
- 20. 關於返回一個未初始化的變量(C/Obj-C)
- 21. 關於變量值的變化。
- 22. 關於引用變量和C#中的變量傳遞的簡單問題
- 23. 與相關聯的類的變量在C#(用於JSON)
- 24. 新手:關於一個類中的ios/objective -c變量定義
- 25. 混淆關於變量的範圍用C
- 26. Visual Studio中用於C++代碼的變量依賴關係圖
- 27. 記憶mgmt關於記憶變量的問題 - 客觀c
- 28. 關於添加三個變量的問題C++
- 29. 未關閉變量的關閉變量
- 30. 混亂關於Ruby類變量
你能提供一個例子嗎? – 2014-09-06 17:09:30