static關鍵字將全局變量的作用域限定爲該翻譯單元。 如果我在.h文件中使用static int x
並將每個其他文件包含該.h文件,是不是它們都屬於同一個翻譯單元? 那麼,到處都不會看到x? 那現在靜態的作用是什麼?C++ - 好的在.h文件中聲明靜態全局變量?
此外,是否有任何使用static const int x
,其中x是一個全局變量? 默認情況下,所有常量全局變量都不是靜態的嗎? 即使它被限制在文件的for循環中,const變量的作用域限於TU嗎?
static關鍵字將全局變量的作用域限定爲該翻譯單元。 如果我在.h文件中使用static int x
並將每個其他文件包含該.h文件,是不是它們都屬於同一個翻譯單元? 那麼,到處都不會看到x? 那現在靜態的作用是什麼?C++ - 好的在.h文件中聲明靜態全局變量?
此外,是否有任何使用static const int x
,其中x是一個全局變量? 默認情況下,所有常量全局變量都不是靜態的嗎? 即使它被限制在文件的for循環中,const變量的作用域限於TU嗎?
如果你寫
static const int x
在.H文件,那麼每一個翻譯單元,的#include -s這個.H將擁有自己的私有變量x
。
如果你想有1全局變量所有人都看得到,你應該寫
extern const int x;
在
.H文件
和
const int x = ...;
在的.cpp文件之一。
如果您想讓一個靜態const int對於一個翻譯單元可見 - 請不要在.h文件中提及它。
您將最終將每個翻譯的該變量的私人副本,這將導致如果你把它放在那裏膨脹。如果要在整個地方隨機複製也是沒有意義的。不,這不好。
您可以在namespace
區塊聲明const int
;沒關係。
基本上,每個源文件與所有包含的頭文件一起是一個單獨的翻譯單元。因此,如果頭文件中有一個靜態變量,那麼它將在包含頭文件的每個源文件(轉換單元)中是唯一的。
如果我在.h文件中使用static int x幷包含.h文件每 其他文件,是不是都屬於同一個翻譯單元?
如果您將某些內容聲明爲static(不在類內部,static class關鍵字具有不同的語義),則該靜態變量不能在其TU外部看到。因此將它放在頭文件中會導致包含該頭的每個TU擁有該靜態變量的不同私有副本。
而且,const變量的作用域限於TU,即使它將 限制在文件中的for循環中?
NO。即使對於一個靜態const值,範圍是由它的聲明決定的。所以範圍將被括號限制。
const
合格的變量的可觀察差異是在static
版本中,您將獲得每個翻譯單元一個副本,因此兩個此類副本的地址比較可能會失敗。
如果您從不使用const
變量的地址,那麼任何現代編譯器都應該能夠使用該值並優化變量本身。在這種情況下,static
const
-qualified變量是完全沒問題的。
我發現在頭文件中最常用的靜態方法是引入錯誤或使調試更加困難。 – PlasmaHH 2012-08-15 10:21:43