为了在 C++11 中的声明中保留静态值的定义,可以使用嵌套的静态结构。在这种情况下,静态成员是一个结构,必须在 .cpp 文件中定义,但值在标头中。
class BaseClass
{
public:
static struct _Static {
std::string bstring {"."};
} global;
};
不是初始化单个成员,而是初始化整个静态结构:
BaseClass::_Static BaseClass::global;
这些值通过以下方式访问
BaseClass::global.bstring;
请注意,此解决方案仍然存在静态变量初始化顺序的问题。当使用静态值初始化另一个静态变量时,第一个静态变量可能尚未初始化。
// file.h
class File {
public:
static struct _Extensions {
const std::string h{ ".h" };
const std::string hpp{ ".hpp" };
const std::string c{ ".c" };
const std::string cpp{ ".cpp" };
} extension;
};
// file.cpp
File::_Extensions File::extension;
// module.cpp
static std::set<std::string> headers{ File::extension.h, File::extension.hpp };
在这种情况下,静态变量头将包含 { "" } 或 { ".h", ".hpp" },具体取决于链接器创建的初始化顺序。