在阅读了很多有关静态变量初始化的问题后,我仍然不确定这如何适用于const
命名空间级别的变量。
我有以下代码header file config.h
由构建脚本生成:
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
根据我读到的static
关键字不是必需的,甚至在这里已弃用。
我的问题:上面的代码容易出现静态初始化失败吗?
如果我有以下内容header file myclass.h
:
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
这会给静态初始化带来任何问题吗?
如果我理解正确的话,由于const
具有内部链接的变量在这两种情况下都应该没有问题吗?
Edit:(由于dribeas的回答)
也许我应该提到我对以下用例感兴趣:
In main.cpp
:
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
关于此用例的另一个问题:编译器会优化掉吗path2
在这种情况下?
您的第一个定义位置path1
在每个编译单元中包括config.h
。为了避免这种情况,不要在头文件中定义变量。通常您会将标头中的变量声明为extern
:
extern const std::string path1;
extern const MyClass myclass1;
并在翻译单元中定义它们,例如config.cpp
:
const std::string path1 = "/xyz/abc";
const MyClass myclass1("test");
有时您需要一个只能在一个翻译单元中使用的常量变量。然后您可以在文件范围内将该变量声明为static
.
static const std::string path1 = "/xyz/abc";
static
不再弃用。static
and extern
有时是隐含的,但我总是忘记在哪里以及如何,所以我通常为所有名称空间级变量显式指定它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)