2014-09-24 97 views
2

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

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

+1

任何禁用异常取决于使用的工具,库,OS ... =>您的问题的答案也取决于这一点。标准C没有例外。 – deviantfan 2014-09-24 22:57:41

+0

@deviantfan:标准* C++ *,但是,有一些例外。 – 2014-09-24 23:03:08

+0

如果你正在编译SOURCE代码(包括头文件)并且没有“例外”,并且有一些抛出异常的代码,那么编译器会出错(至少在g ++和clang ++中) - 换句话说,编译。 – 2014-09-24 23:03:46

回答

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在功能

总代码:

XH:

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

+0

Your're right ...我使用GCC,MinGW,MinGW W64,CLang和MSVC ...所有这些都编译我没有错误,如果我尝试禁用GCC和CLang中的异常,它不会编译,但在MSVC中,我不想这样做。这就是问题的原因,检测异常的禁用并避免编译。 – yayuj 2014-09-24 23:27:58

相关问题