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.

komentarze obsługiwane przez Disqus