如何用另一个静态变量初始化静态变量?

Ruf*_*fus 0 c++ global-variables static-variables

Static1.hpp

#include <string>
class Static1
{
    public:
        static const std::string my_string;
};
Run Code Online (Sandbox Code Playgroud)

Static1.cpp

#include "Static1.hpp"
const std::string Static1::my_string = "aaa";
Run Code Online (Sandbox Code Playgroud)

Static2.hpp

#include <string>
class Static2
{
    public:
        static const std::string my_string;
};
Run Code Online (Sandbox Code Playgroud)

Static2.cpp

#include "Static2.hpp"
const std::string Static2::my_string = Static1::my_string;
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "Static2.hpp"
#include <iostream>

int main(argc int, char** argv)
{
     cout << to_string(Static2::my_string == "aaa") << endl;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我放入add_executable(printMyString main.cpp Static2.cpp Static1.cpp)我的CMakeLists.txt,我会得到

0
Run Code Online (Sandbox Code Playgroud)

虽然add_executable(printMyString main.cpp Static2.cpp Static1.cpp)给了我预期的行为

1
Run Code Online (Sandbox Code Playgroud)

为了使我的代码更容易维护(这样我就不需要跟踪我列出源文件的顺序),有什么办法可以确保我得到的行为在哪里Static2::my_string == "aaa"

AMA*_*AMA 5

您正在遇到static初始化顺序惨败的影响.

通常的解决方法是将静态变量替换为在作用域中具有静态变量的函数,初始化并返回它.


以下是如何为您的示例完成的操作: Live Example (order1) Live Example (order2)

class Static1
{
    public:
        static std::string my_string();
};
Run Code Online (Sandbox Code Playgroud)

...

std::string Static1::my_string()
{
   static const std::string my_string = "aaa";
   return my_string;
}
Run Code Online (Sandbox Code Playgroud)

...

class Static2
{
    public:
        static std::string my_string();
};
Run Code Online (Sandbox Code Playgroud)

...

std::string Static2::my_string()
{
   static const std::string my_string = Static1::my_string();
   return my_string;
}
Run Code Online (Sandbox Code Playgroud)

...

std::cout << std::to_string(Static2::my_string() == "aaa") << std::endl;
Run Code Online (Sandbox Code Playgroud)