在g++編譯時,程式若為了效能考量可能希望減少執行時對exception機制的overhead,可用-fno-exceptions 這個選項關掉exception
但此時就無法使用try catch 可用 #if __cpp_exceptions 來做處理,
或是使用c processor的predefined macro
https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
__EXCEPTIONS
This macro is defined, with value 1, when compiling a C++ source file with exceptions enabled. If -fno-exceptions is used when compiling the file, then this macro is not defined.
int main() { #if __cpp_exceptions throw "123"; #endif }
g++ -fno-exceptions test.cc
關掉exception後就不可以用try catch throw了
若不用exception機制時 則要小心所使用的library是否會拋出exception
以g++的libstdc++來說 利用macro處理 try catch throw等 可在編譯(libstdc++)時關掉exception
在bits/exception_defines.h (libstdc++-v3\libsupc++\exception_defines.h)
#ifndef __EXCEPTIONS // Iff -fno-exceptions, transform error handling code to work without it. # define __try if (true) # define __catch(X) if (false) # define __throw_exception_again #else // Else proceed normally. # define __try try # define __catch(X) catch(X) # define __throw_exception_again throw #endif
這時在STL library的throw 在-fno-exceptions之下會呼叫abort()
參考libstdc++-v3/src/c++11/functexcept.cc _GLIBCXX_THROW_OR_ABORT
但注意 編譯選項-fno-exceptions 只是當下編譯的選項,而有些library原本在編譯時是啟用exception的,程式link library object以後如果有exception,結果會是程式接不到exception而中止
因libstdc++.so 預設有exception,所以儘管有-fno-exceptions,使用到stl有exception時一樣會中止
除非是對STL另外編譯no exception版本,雖然一樣是abort()
這樣變得使用STL反而會要考慮底層的function是否會產生exception,反而是負擔了~
-fno-exceptions 這種情況比較適合是使用C的library 把C++當成better C來使用,或是使用的函式庫是在可以掌握不會有exception的情況下才適合使用