2011-01-14 75 views
2

在C++中,const變量對其他翻譯單元隱式隱藏。是可以預防的嗎?訪問跨變換單元的常量變量

+0

防止一個有內部聯繫,或者防止他們默認內部聯繫? – 2011-01-14 10:31:40

+2

@Steve:只有一個。我不想改變語言規則;-) – fredoverflow 2011-01-14 10:40:23

回答

7

是的,在extern的前面定義例如。

extern const int x = 10; 
3

使用extern關鍵字:

extern const int x = 10; 

這迫使變量有外部鏈接。

對於命名空間範圍變量,這通常是默認值,並且您將使用static(或更好的是,匿名命名空間)來強制內部鏈接。

我沒有真正知道命名空間範圍const變量默認有內部鏈接,直到我閱讀你的問題並試用它,所以非常感謝。每天學些新東西!

3

它可以通過extern關鍵字來實現:

// a.cpp 
extern const int x = 10; // definition 
// b.cpp 
extern const int x;  // declaration 

這將產生的影響是,你將不需要重新編譯b如果在a的不斷變化的價值,但在同一當你放棄使用x作爲編譯時間常數在b.cpp(即你將不能寫int array[x];)的能力時。

如果沒有很強烈的理由,我寧願在頭文件中定義常量,並將其包含在所有需要它的翻譯單元中;

// c.h 
const int x = 10; 
// a.cpp 
#include "c.h" 
// b.cpp 
#include "c.h" 

你將不得不重新編譯依賴於每個變化不斷的所有翻譯單元,但你將能夠在所有的翻譯單位在編譯時使用它。這種方法的侷限性是,如果您更改常量並僅重新編譯某些翻譯單元,則該常量的值將不一致(這違反了ODR)。