c++ - Visual Studio:如果启用了编译器选项,如何测试(在代码/静态断言中)
问题描述
我想在代码中检查某些选项是否在编译时设置。
具体来说,我已经实现了一些异常处理,并希望使用 static_assert 来确保在 Visual Studio 编译器中设置了 /EHa 选项。(我正在使用启用 C++Latest 的 2017 和 2019)
我的解决方案有 54 个项目,每个项目都有 4 个配置......很容易错过一个。或者...如果未设置该选项,我可能希望代码有所不同...。
非常感谢
解决方案
当我使用这些选项时,我确实发现编译器已经为此发出警告:warning C4535: calling _set_se_translator() requires /EHa
我查看了这是否是 VS 标头中函数的属性或装饰器,因此我可以将它直接移植到我的代码中,但找不到任何东西。
到目前为止,我已决定在代码中添加注释,以便其他开发人员查看何时给出警告。
// Save & Restore the Structured Exception Handler
// Set our own handler during the call
class Scoped_SE_Translator
{
private:
const _se_translator_function old_SE_translator;
public:
Scoped_SE_Translator() = delete;
Scoped_SE_Translator(_se_translator_function new_SE_translator) noexcept : // NOTE: Compiler option /EHa is required ("Enable C++ Exception" = "Yes with SEH Exceptions")
old_SE_translator{_set_se_translator(new_SE_translator)} { }
~Scoped_SE_Translator() noexcept { _set_se_translator(old_SE_translator); }
};
我还在现有的 solution.props 文件中设置了项目默认值:
<ItemDefinitionGroup>
<ClCompile>
<ExceptionHandling>Async</ExceptionHandling>
<FloatingPointExceptions>true</FloatingPointExceptions>
<TreatSpecificWarningsAsErrors>4535;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
</ClCompile>
</ItemDefinitionGroup>
但是,这取决于开发人员在新的 vcxproj 文件中添加一行:
<Import Project="$(SolutionDir)SolutionSettings.props" />
我不确定是否有更“有力”的方式来确保新项目具有“正确”的默认值。
推荐阅读
- java - 应用程序上下文获取空值
- google-sheets - 如何在谷歌表格中的公式中返回一个值
- c# - C#浮点到字符串分隔符
- r - stargazer 中多个多项式模型的变量名称
- python - 分析预测调用 Tensorboard
- javascript - 为什么我在 Jest 测试中收到错误 Unexpected keyword 'new'?
- c# - 在 Intent Architect 模板中,如何检查属性的类型是否为枚举顺序以生成适当的代码?
- python - 在 python 中,如何比较两个数字字符串而不将它们转换为 int()?
- c++ - CMakeLists - 如何包含源文件和头文件的目录?
- javascript - 为什么这里的箭头函数/方法的“this”===窗口?