静态1.hpp
#include <string>
class Static1
{
public:
static const std::string my_string;
};
静态1.cpp
#include "Static1.hpp"
const std::string Static1::my_string = "aaa";
静态2.hpp
#include <string>
class Static2
{
public:
static const std::string my_string;
};
静态2.cpp
#include "Static2.hpp"
const std::string Static2::my_string = Static1::my_string;
主要.cpp
#include "Static2.hpp"
#include <iostream>
int main(argc int, char** argv)
{
cout << to_string(Static2::my_string == "aaa") << endl;
return 0;
}
如果我将 add_executable(printMyString main.cpp Static2.cpp Static1.cpp)
放入我的 CMakeLists.txt,我会得到
0
虽然 add_executable(printMyString main.cpp Static2.cpp Static1.cpp)
给我预期的行为
1
为了使我的代码更易于维护(这样我就不需要跟踪我列出源文件的顺序),有什么方法可以确保我得到 Static2::my_string == "aaa"
?
最佳答案
您正在体验 static
initialization order fiasco 的影响.
通常的解决方法是用范围内具有静态变量的函数替换您的静态变量,初始化并返回它。
这里是如何为你的例子完成的: Live Example (order1) <知识库> Live Example (order2)
class Static1
{
public:
static std::string my_string();
};
...
std::string Static1::my_string()
{
static const std::string my_string = "aaa";
return my_string;
}
...
class Static2
{
public:
static std::string my_string();
};
...
std::string Static2::my_string()
{
static const std::string my_string = Static1::my_string();
return my_string;
}
...
std::cout << std::to_string(Static2::my_string() == "aaa") << std::endl;
关于c++ - 如何用另一个静态变量初始化一个静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46562265/