2014-09-06 80 views
1

我正在閱讀一本C++書(C++ primer),現在有一件我無法弄清楚的東西。
爲什麼如果我有2個不同的cpp文件,並且我聲明&在這些文件中定義了一個具有相同名稱的變量,編譯器會給我一個鏈接錯誤?文件的變量是本地的嗎?C++關於變量

+2

你能提供一個例子嗎? – 2014-09-06 17:09:30

回答

1

變量本地文件?編號

與h文件相反,cpp文件沒有特別的特別之處;當你編譯一個cpp文件(比如說,以標準的方式,到一個.o)時,引入h文件的#include只是簡單地將h文件注入到編譯流中。這方面的頭文件是組織實體。

您可以將int foo;放在一個cpp文件中,extern int foo;放在另一個文件中,將每個文件編譯爲一個目標文件並將它們鏈接在一起。第二個文件然後可以訪問第一個文件中的同一個對象(extern int foo;被推入到cpp文件中的事實實際上並不相關)。出於同樣的原因,將int foo;放置在兩個不同的cpp文件中時,將它們鏈接在一起時會產生歧義。

爲了確保INT FOO在一個轉換單元(編譯的.o/obj文件,如果你會)真的只由單位,你可以做兩件事情之一:

  1. 聲明foo對象是靜態的,如下所示:static int foo;這個變量不受外部鏈接影響;它對一個翻譯單位來說是真正的私人。
  2. 把int對象在具名命名空間,如下所示:

    namespace { // Foo is in a unique namespace for this object file int foo; }

這種特殊的構建體產生用於每個轉換單元唯一的命名空間。這會導致跨目標文件的每個foo對象都是不同的。

+0

謝謝!很好的解釋。所以.h文件的目的是告訴編譯器哪些方法/函數/其他東西在其他.cpp中,然後讓你在你想要的任何.cpp中使用它們,對吧? – 2014-09-06 19:32:55

+0

不完全。 cpp中的代碼和h中的代碼看起來與編譯器相同,並且處理方式相同。 h文件仍然是你放置共同實體的地方;在這種情況下,聲明 - 'extern int foo;'。這樣,任何想在您的cpp文件中使用int的人都可以#包含您的h文件,並將'extern int foo;'注入到它們的代碼中。這是爲了您的利益,而不是編譯器。 – 2014-09-06 19:46:37

1

如果用static關鍵字聲明變量,它們將是相應編譯單元的本地變量,並且不會收到錯誤。否則,它們是全球性的,應該可以訪問整個程序,因此會產生錯誤。