首页 > 解决方案 > Visual Studio:如果启用了编译器选项,如何测试(在代码/静态断言中)

问题描述

我想在代码中检查某些选项是否在编译时设置。

具体来说,我已经实现了一些异常处理,并希望使用 static_assert 来确保在 Visual Studio 编译器中设置了 /EHa 选项。(我正在使用启用 C++Latest 的 2017 和 2019)

我的解决方案有 54 个项目,每个项目都有 4 个配置......很容易错过一个。或者...如果未设置该选项,我可能希望代码有所不同...。

非常感谢

标签: c++visual-studiostatic-assertcompiler-options

解决方案


当我使用这些选项时,我确实发现编译器已经为此发出警告: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" />

我不确定是否有更“有力”的方式来确保新项目具有“正确”的默认值。


推荐阅读