2013-01-20 23 views
2

我用#pragma once經常和它似乎做工精細用頭和但由於某些原因打交道時,以下代碼創建的多個定義鏈接器錯誤:的#pragma一次並不妨礙多變量定義

#pragma once 
int someVariable=5; 

pragma也不應該這樣做嗎?

+2

#pragma曾用於標題中。不要在頭文件中定義一個變量!只是宣佈它。 #pragma一次只能防止它被同一個文件多次包含,但不能被總共多次(例如,可以被兩個不同的文件包含兩次)。 – thang

+4

它避免了頭部的內容被包含在同一個TU中,而不是跨越TU。通過在標題中定義變量來打破ODR。 –

回答

5

該編譯指示不應該阻止這個嗎?

不,在這種情況下,如果此頭文件包含在多個位置,則會創建someVariable的多個定義。如果B.h和C.h都包含頭文件,則會創建兩個someVariable。

更好的辦法是隻在一個.cpp文件中定義變量,並在其他地方使用extern

+2

這有點誤導人;如果B.h和C.h在同一個翻譯單元中,你仍然只能獲得原始頭文件的一個副本。問題是當2個cop文件包含它並且它們都在它們的目標文件中時。 –