2014-09-24 139 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

相關問題