2016-03-11 68 views
0

在我的項目中,我有多個頭文件和源文件。大多數這些文件包括被稱爲settings.h 頭文件這個文件看起來像這樣訪問公共頭文件的多個源文件和頭文件

#ifndef EXTERNAL_H 
#define EXTERNAL_H 

#define processID 12 
... 
#endif // EXTERNAL_H 

現在我發現,如果我從改變的ProcessID一個定義的類型,如本

int processID; 

我開始獲取鏈接器錯誤。我想知道是否有辦法讓我將processID從define定義爲int類型。

回答

2

鏈接器錯誤是由包含該標題的每個源文件中生成具有相同名稱的符號的事實給出的。

所以解決這個問題,你有多種選擇,但一個在C++ 11應該是這樣,這是constexpr符:

constexpr int processID = 12; 

另一種解決方案是使用static符,但是這將創建一個每個源中具有相同名稱的不同變量,僅僅是因爲每個符號隱藏在每個源內部而僅僅是防止衝突。

第三個解決方案是使用const int,因爲const的值無法修改,無論在每個源文件中生成了多少個,它們都會解析爲相同的值。

+0

我注意到靜態作品 – Rajeshwar

+0

enum {processId = 12};'也經常有效。 – Yakk

+0

@Yakk:是的,它可以工作,但我認爲它是一種黑客行爲,因爲'enum'意味着代表一組有限的可能值,在這種情況下情況並非如此。事實上,自從C++ 11開始,我甚至不再使用'enum',但是'enum class'避免了這個問題。 – Jack

1

我想知道是否有辦法讓我將processID從定義更改爲int類型。

最簡單的方法是將其轉換爲一個const聲明:

const int processID = 12; 
1

您需要在標題中使用extern int processID;,但那麼你就需要在源一個int processID = 12;文件 - 這是因爲extern關鍵字指定實際對象存在於別的地方,它沒有定義它。如果你沒有在源文件中聲明int,你會得到一個鏈接器錯誤,指出這個對象沒有被定義。

或者,constconstexpr會將對象減少到本地範圍。