有没有办法知道C ++中是否已禁用异常?
我正在开发一个使用异常的应用程序,我希望避免让用户在禁用异常的情况下编译应用程序,例如警告您需要例外。
答案 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
。