爲什麼會發生這種情況,如果我有到位的後衛?我認爲他們阻止了第一次訪問後頭部被讀入。
包括警衛確保頭只包含一次一個文件(翻譯單元)。對於包含標題的多個文件,您希望將標題包含在每個文件中。
通過定義,而不是在頭文件中聲明變量具有外部鏈接(全局變量),你只能包括一次源文件中的標題。如果將標題包含在多個源文件中,則會有多個變量的定義,這在C++中是不允許的。因此,正如你已經發現的那樣,在頭文件中定義變量是一個壞主意,正是出於上述原因。
爲什麼在這個頭文件中的衆多枚舉不會也給LNK4006警告?
因爲它們沒有定義「全局變量」,它們只是關於類型的聲明等,它們不保留任何存儲空間。
如果我在簽名之前添加靜態,我不會收到警告。這樣做的含義是什麼?
當你做出一個變量static
,它具有靜態範圍。該對象在定義它的翻譯單元(文件)之外不可見。所以,簡單來說,如果您有:
static int i;
在你的頭,每一個源文件在其中包括頭將獲得單獨int
變量i
,這是源文件的看不見外面。這就是所謂的內部聯動。
有沒有更好的方法來做到這一點,以避免錯誤,但讓我聲明數組頭。我真的很討厭有一個cpp文件只是爲了一個數組定義。
如果你想在陣列從所有你的C++文件中的一個對象可見,你應該做的:
extern int array[SIZE];
在你的頭文件,然後包括在所有的C++源文件的頭文件那需要變量array
。在源(.cpp
)文件中的一個,您需要定義array
:
int array[SIZE];
您應該包括上述源文件中的標題爲好,以允許在頭捕捉由於錯誤的區別和源文件。
基本上,extern
告訴編譯器「array
定義在某處,並具有類型int
和大小SIZE
」。然後,你實際上定義array
只有一次。在鏈接階段,一切都很好地解決。
鏈接器只是將數組語法轉換爲指針語法。它不是一個錯誤,它只是一個警告,程序按預期執行。 – Steve 2010-01-21 00:11:44