有没有办法知道是否已禁用异常?

时间:2014-09-24 22:56:09

标签: c++

有没有办法知道C ++中是否已禁用异常?

我正在开发一个使用异常的应用程序,我希望避免让用户在禁用异常的情况下编译应用程序,例如警告您需要例外。

1 个答案:

答案 0 :(得分:2)

标准当然不会接受这样的功能。

假设您正在使用现代且称职的编译器来编译包含throw的代码,那么编译器将会出错。但是你当然可以用异常编译代码的一部分,而另一部分则没有,在这种情况下你仍然会抛出异常,但无法捕获它们(因为也没有catch)。所以程序可能会在抛出第一个异常时终止。

如果提供标题,则只需在未命名的命名空间中添加虚函数:

namespace {
   inline void dummy_dummy_my_thing_to_check_exceptions()
   { 
       throw 123;
   }
}

从不调用该函数,它仍然无法编译。

我怀疑任何允许你关闭异常的编译器都会接受执行此操作的代码 - 我尝试过使用g ++ 4.8.2,g ++ 4.6.3,clang ++ 3.6.0(截至三周前)和clang ++ 2.9。所有都在头文件中给出上述函数的错误。如果我删除-fno-exceptions,代码将编译并运行(使用终止,因为代码在函数中执行throw 1

总代码:

x.h:

extern int func();

namespace {
    inline void dummy_dummy_my_thing_to_check_exceptions()
    { 
    throw 123;
    }
}

x.cpp:

int func()
{
    throw 1;
}

except.cpp:

#include "x.h"

int main()
{
    func();
}

编译:

g++ -c except.cpp && g++ except.o x.cpp

clang++ -c except.cpp && clang++ except.o

但不会编译:

g++ -c except.cpp -fno-exceptions && g++ except.o x.cpp

clang++ -c except.cpp -fno-exceptions && clang++ except.o