在编译时检测是否禁用了异常

时间:2016-02-23 08:03:31

标签: c++ exception

我试图在编译时检测是否已使用(-fno-exceptions)开关禁用了异常。我试过评估:

noexcept(throw)

但是如果在gcc和clang下都禁用了异常,那就不会编译。

编辑:看看here

3 个答案:

答案 0 :(得分:5)

当您启用了例外时,符号__cpp_exceptions由gcc设置。然后添加一个宏,无论是扩展为空还是异常处理。这里的文档中有一些例子:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html

在这个意义上,至少clang与gcc兼容 - 您可能需要在Microsoft(或MS兼容)编译器中使用不同的变体。我根据选项的名称假设gcc和/或clang。

答案 1 :(得分:4)

与往常一样,使用给定的一组命令行参数检查特定编译器的预定义宏是相当容易的:

$ g++ -dM -E -x c++ - < /dev/null &> except.txt
$ g++ -dM -E -x c++ -fno-exceptions - < /dev/null &> no-except.txt
$ sdiff -s except.txt no-except.txt 
#define __EXCEPTIONS 1                            <
#define __cpp_exceptions 199711                   <
$

答案 2 :(得分:1)

如果是gcc,您可以查看以下宏:

  

__ EXCEPTIONS

     

在编译启用了异常的C ++源文件时,使用值1定义此宏。如果使用-fno-exceptions   在编译文件时,未定义此宏。