簡體   English   中英

命名空間中的const全局變量

[英]const global variable in namespace

我知道static const class成員只能在頭文件中初始化。 命名空間是否相同? 例如,寫入是否有效:

namehuman.hpp

namespace namehuman
{
   string const human("human");
}

main.cpp

#include "namehuman.hpp"
cout << namehuman::human << endl;

我想知道包括頭文件在內的所有文件是否都有自己的string人類副本,或者人類是否是真正的全局變量(不會多次復制)。 為了避免每個包含文件的副本,我是否有義務使用extern

常量具有內部聯系。 因此,任何包含帶有常量定義的頭的編譯單元都將擁有自己的對象實例。

根據C ++標准(3.5程序和鏈接)

3具有命名空間范圍(3.3.6)的名稱具有內部鏈接(如果它的名稱)

...

- 一個非易失性變量,顯式聲明為const或constexpr,既未顯式聲明為extern,也未聲明為具有外部鏈接; 要么

如果需要具有外部鏈接的常量,則必須使用說明符extern聲明它,並在編譯單元中定義它。

我認為這將多次定義human ,因此可能會導致ODR違規(見下文)。 通常最好只在標題中聲明它

extern const string human;

並將定義添加到實現文件中

string human("human");

關閉應用程序時,請注意初始化順序fiasco和等效項。

當具有外部鏈接ODR的內聯函數使用human時,可能會導致ODR違規。 我認為,由於這很容易做到並且沒有辦法防范它,最好在實現文件中定義常量字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM