以编程方式确定是否启用了例外

时间:2011-06-26 22:02:13

标签: c++ exception metaprogramming

大多数C ++编译器允许禁用异常。有没有办法从代码中确定它而不使用特定于编译器的预处理器宏,例如MSVC的_CPPUNWIND?理想情况下,在编译时。

3 个答案:

答案 0 :(得分:6)

没有。例外是C ++的一部分。某些编译器允许您禁用它们的事实是无关紧要的,标准将不会让您检测它们是否已启用 - 就其而言,它们始终处于启用状态。如果您想了解特定于实现的行为,唯一的方法就是询问实现。

答案 1 :(得分:6)

WG21 in 2014开始,有一个推荐使用的宏

__cpp_exceptions

如果支持异常并且编译器符合C ++ 98,它将具有值199711。其他similar feature macros are shown here

答案 2 :(得分:3)

我根本没有给这个决定带来负担。相反,我会构建两个库:

libfoo.a
libfoo_exc.a

然后我会让我的configure脚本确定我们是否有异常,并将Makefile设置为:

ifeq($HAVE_EXCEPTIONS, 1)
  foolib=foo_exc
else
  foolib=foo
endif

libs=$(libs) -l$(foolib)

$(TARGET): $(OBJECTS)
    $(CXX) -o $(TARGET) $(OBJECTS) $(LDFLAGS) $(LIBS)

要确定您是否有例外,您可以尝试使用评论中建议的简单try / catch块构建一个微小的测试程序。

要实际构建库,只需编写条件代码:

#if HAVE_EXCEPTIONS > 0
/* ... */
#else
/* ... */
#endif

然后构建两个库,一个带有-DHAVE_EXCEPTIONS=0,另一个带有-DHAVE_EXCEPTIONS=1或类似的东西。

这样您就没有运行时开销,您的客户可以使用他们喜欢的任何库。