2014-11-06 27 views
2

類的靜態成員被編譯爲類作用域的全局變量。編譯的const靜態成員和靜態constexpr成員如何? 編譯器是否爲每個.o文件創建了此靜態成員的副本,否則它就完成了嗎?靜態const成員是否有內部聯動?

+0

常規靜態const成員有外部鏈接。 – 2014-11-06 11:09:28

+0

如果我在類聲明(.h文件)中放置了一些靜態常量成員的定義,爲什麼鏈接器不提供有關雙重定義(如果是外部鏈接)的警告? – 2014-11-07 10:17:32

+0

因爲整數有一個特例。除非你在課堂外給他們定義,否則他們沒有聯繫。 – 2014-11-07 10:55:28

回答

3

這是通過C++ 14 [class.static.data]/5覆蓋:

Static在命名空間範圍的一類的數據成員具有外部連接。本地類不得有靜態數據成員。

「名稱空間範圍內的類」表示不在塊範圍內的類(又名「本地類」)。例如,此代碼:

void func() 
{ 
    class C { static const int x = 5; }; 
} 

不合格。


要回答你的問題:

編譯器是否爲每個.o文件將使得這一靜態成員的副本,或者它以其他方式呢?

通常情況下,如果靜態成員在類的外部有一個定義,那麼它將有一個副本,在與該定義的位置相對應的目標文件中,否則將不存在。

相關問題