簡體   English   中英

在命名空間c ++中正確聲明extern變量

[英]Correctly declaring extern variable in a namespace c++

我有一些const變量,我希望在多個源文件之間共享值。 我還希望變量的范圍限於命名空間。 我不確定最好/正確的方法嗎?

我可以使用#define但希望類型安全。

到目前為止,我有以下工作:

File0.h

#pragma once

namespace Namespace1
{
   extern const int variable1;
   extern const int variable2;
}

File0.cpp

const int Namespace1::variable1 = 10;
const int Namespace1::variable2 = 10;

Source1.cpp

#include "File0.h"
int result1 = Namespace1::variable1 + Namespace1::variable2;

Source2.cpp

#include "File0.h"
const int result2 = Namespace1::variable1 + Namespace1::variable2;

使用extern我如何知道值何時初始化?

使用extern我如何知道值何時初始化?

你沒有。 這被稱為靜態初始化順序fiasco 在不同的翻譯單元中初始化命名空間范圍靜態對象是以未指定的順序完成的。 如果一個靜態對象依賴於另一個轉換中的另一個對象進行初始化,則該行為是未定義的。

即使使用簡單的整數,也可能發生這種災難。 由於您的目的是避免宏(一個有價值的目標),您可以在標頭中定義這些常量:

namespace Namespace1
{
    const int variable1 = 10;
    const int variable2 = 10;
}

這不會違反單定義規則,因為C ++標准(即使在2003年)允許通過使它們隱式地具有內部鏈接來在多個轉換單元中定義這樣的積分常量。 它們也是常量表達式,就像宏會產生的一樣。

暫無
暫無

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

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