Ryzykowne słowo exception
Jak wszystkim wiadomo, nazwę exception nosi bazowa klasa hierarchii wyjątków wykorzystywanych przez bibliotekę standardową C++. Często zatem spotyka się konstrukcje typu:
#include <exception> #include <iostream.h> // Akurat mam powody używać stare iostream int main() { try { // .... } catch(exception& e) { cout << "Nieoczekiwany wyjątek: " << e.what() << endl; } }
(dopisanie using namespace std; czasami jest potrzebne a czasami nie).
Wygląda fajnie ale np. na Digital Unixie kompilując powyższy program dowiadujemy się, że:
cxx test.cxx -o test.exe cxx: Error: test.cxx, line 9: "exception" is ambiguous catch(exception& e) ---------^ cxx: Info: 1 error detected in the compilation of "test.cxx".
Powód jest prosty: exception jest nazwą jakiejś dziwnej struktury definiowanej przez dodawaną do DEC C i DEC CXX biblioteczki z kilkoma funkcjami matematycznymi. Tak się śmiesznie składa, że biblioteczka owa jest include-owana przez plik math.h a jeszcze śmieszniej, że math.h jest include-owane przez iostream.h.
Niby banalne, ale zanim się tego dopatrzyłem straciłem trochę czasu. Poradzić sobie łatwo. Wystarczy pisać:
// .... catch(std::exception& e) // ...
co obecnie zawsze robię.
Opisałem sytuację z Digital Unixa ale o ile wiem, słowo exception wśród autorów bibliotek numerycznych jest dosyć popularne.
- «String i vector nie chcą oddać pamięci
- Rzutowanie typów całkowitych wymaga dyscypliny»
- ↑C++ - sztuczki i niebezpieczeństwa