如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
How to deal with Boost Spirit X3 causing a "static initialization order fiasco" in Visual Studio 2019?
我正在 boost::spirit::x3 之上的 C++ 中研究一个重要的解析器。我正在将解析代码拆分为逻辑单元,其中一些是彼此的依赖关系。例如,一个单元是一个表达式分析器,它也公开一个标识符分析器。目标语言的许多高级语法结构都包含表达式和标识符,因此此单元通常是依赖项。我已按照文档的建议将代码拆分为三重文件。如果有单位foo、bar和quux,我有这样的文件:
parser
foo.h
foo_def.h
foo.cpp
bar.h
bar_def.h
bar.cpp
quux.h
quux_def.h
quux.cpp
其中.h
BOOST_SPIRIT_DECLARE
展开;_def.h
BOOST_SPIRIT_DEFINE
展开,.cpp
BOOST_SPIRIT_INSTANTIATE
展开。我遇到了一个持续存在的问题,由于 Spirit 代码中的静态初始化惨败(.../x3/nonterminal/rule.hpp 的第 160 行(,我的代码在启动时出错,但仅在运行调试版本时。
基于像这个和这个这样的堆栈溢出问题和答案,再加上代码在发布配置中构建时执行时没有错误的事实,我相信我的代码没有任何问题。如果无法在调试中修复我的代码,我可以看到两种解决方法:
仅在调试版本中使用杂注声明来更改静态初始化的顺序。(更改.vcxproj文件中项的顺序不会影响初始化顺序(在Visual Studio中,如果我在表达式解析器的.cpp文件中放置一个
#pragma init_seg(lib)
,问题就会消失。仅在调试版本中在必要时包含多余的
_def.h
文件,例如,如果quux依赖于上面的bar,那么在quux.cpp
中包含bar_def.h
将解决问题,但违背了将解析器拆分为多个文件的目的。
我想知道这个问题的状态是什么?这似乎是一个已知问题,但已经存在了很长时间,所以我不应该期望它在精神级别得到修复吗?有没有更好的方法来构建我的代码,以免发生此问题?我想知道是否有可能,例如,将所有解析器及其子解析器创建为首次使用时创建的函数范围内的静态变量,但文献中没有这样的例子,所以我不确定是否有可能?
通常的方法是让函数通过引用返回局部静力学。
函数局部静力学
- 具有静态"生命周期"(存储持续时间(,但仅在首次使用时初始化(躲避惨败(
- 从 C++11 开始,您甚至可以依靠初始化来实现线程安全
因此,您可能在标题中:
my_rule_type const& my_rule();
在定义规则的 cpp 中:
my_rule_type const& my_rule() {
static const my_rule_type s_my_rule = ns::my_rule;
return s_my_rule;
}
更新
实际上,文档示例不会为返回引用而烦恼,而是每次返回一个副本:
parser::employee_type employee()
{
return parser::employee;
}
这表明这样做不会有明显的开销,我建议您避免引用语义的复杂性。
- 如何在MS Visual Studio 2019中运行QT UI
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 将QT项目导入Visual Studio 2019会给我带来很多LNK2001错误
- 使用visual studio 2019正确设置tinycc,找不到库libtcc1-32.a
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 如何为 C++ Visual Studio 2019 指定应用程序图标?
- 在Visual Studio 2019中保存时ReadDirectoryChangesW文件名的问题
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- Visual Studio 2019在内置库中存在错误
- 使用 Visual Studio 2019 编译 Unicode
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 使用 CMake 和 Visual Studio 2019 编译 GLEW?
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- 无法在Visual Studio 2019中打开文件
- Visual Studio 2019编译和构建
- 我可以在Visual Studio 2019上的项目下使用多个主函数吗?
- Visual Studio 2019 / E0167 / "const char"
- 使用 NuGet 填充 Visual Studio 2019 中的 CMake 依赖项