2012-08-15 169 views
11

static關鍵字將全局變量的作用域限定爲該翻譯單元。 如果我在.h文件中使用static int x並將每個其他文件包含該.h文件,是不是它們都屬於同一個翻譯單元? 那麼,到處都不會看到x? 那現在靜態的作用是什麼?C++ - 好的在.h文件中聲明靜態全局變量?

此外,是否有任何使用static const int x,其中x是一個全局變量? 默認情況下,所有常量全局變量都不是靜態的嗎? 即使它被限制在文件的for循環中,const變量的作用域限於TU嗎?

+4

我發現在頭文件中最常用的靜態方法是引入錯誤或使調試更加困難。 – PlasmaHH 2012-08-15 10:21:43

回答

31

如果你寫

static const int x 

.H文件,那麼每一個翻譯單元,的#include -s這個.H將擁有自己的私有變量x

如果你想有1全局變量所有人都看得到,你應該寫

extern const int x; 
.H文件

const int x = ...; 

的.cpp文件之一。

如果您想讓一個靜態const int對於一個翻譯單元可見 - 請不要在.h文件中提及它。

3

您將最終將每個翻譯的該變量的私人副本,這將導致如果你把它放在那裏膨脹。如果要在整個地方隨機複製也是沒有意義的。不,這不好。

您可以在namespace區塊聲明const int;沒關係。

0

基本上,每個源文件與所有包含的頭文件一起是一個單獨的翻譯單元。因此,如果頭文件中有一個靜態變量,那麼它將在包含頭文件的每個源文件(轉換單元)中是唯一的。

6

如果我在.h文件中使用static int x幷包含.h文件每 其他文件,是不是都屬於同一個翻譯單元?

如果您將某些內容聲明爲static(不在類內部,static class關鍵字具有不同的語義),則該靜態變量不能在其TU外部看到。因此將它放在頭文件中會導致包含該頭的每個TU擁有該靜態變量的不同私有副本。

而且,const變量的作用域限於TU,即使它將 限制在文件中的for循環中?

NO。即使對於一個靜態const值,範圍是由它的聲明決定的。所以範圍將被括號限制。

1

const合格的變量的可觀察差異是在static版本中,您將獲得每個翻譯單元一個副本,因此兩個此類副本的地址比較可能會失敗。

如果您從不使用const變量的地址,那麼任何現代編譯器都應該能夠使用該值並優化變量本身。在這種情況下,staticconst -qualified變量是完全沒問題的。