定义静态const std :: string类变量

时间:2016-01-15 14:07:21

标签: c++ c++11 const

如何定义静态const std :: string类变量,可以安全地在我的程序中的任何地方使用?

第一种方法 - 失败static initialization order fiasco

文件: Consts.h

namespace constants {
    struct Consts {
        static const std::string kVar = "123";
    }
}

第二种方法 - 导致将kVar复制到我们包含此标题的每个翻译单元中,这导致一个定义规则违规原则并且可能导致双重释放或在释放错误后使用 - 这是未定义的行为,如果这定义包含在多个cpp文件中(我想这样做,因为我想要全局共享std :: string const)。

文件: Consts.h

namespace constants {
   const std::string kVar = "123";
}

有没有更好的方法(除了使用宏 - 这也是全局如此丑陋的解决方案)以安全的方式定义这样的var?对这种结构有哪些最有效的实践?

1 个答案:

答案 0 :(得分:5)

常见的方法是在头文件中声明静态const变量,但要在cpp文件中通过适当的初始化来定义它:

.h文件:

namespace constants {
    struct Consts {
        static const std::string kVar;
    }
}

.cpp文件:

const std::string constants::Consts::kVar = "123";

另外一件事,命名空间“常量”已经暗示了常量..不需要嵌套名为“Consts”的内部类。松开“Consts”并仅使用相同技术的命名空间。