[英]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.