大多数C ++编译器允许禁用异常。有没有办法从代码中确定它而不使用特定于编译器的预处理器宏,例如MSVC的_CPPUNWIND?理想情况下,在编译时。
答案 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
或类似的东西。
这样您就没有运行时开销,您的客户可以使用他们喜欢的任何库。