Co ma wspólnego Oracle z numeric_limits

Tym razem ciekawostka "trafiona" na OpenVMS (ale prawdopodobnie do zobaczenia i gdzie indziej). Kompilując całkiem niewinny program otrzymałem błąd:

class numeric_limits<signed char> {
......^
\%CXX-E-REDEF, declaration has already been defined by class
          "std::numeric_limits<char>" (declared at line 230) (redef)
at line number 277 in module LIMITS. of text library SYS$COMMON:[SYSLIB]CXXL$ANSI_DEF.TLB;9

Nie muszę chyba wspominać, że nie includeowałem i nie używałem numeric_limits (zrobił to za mnie mój przyjaciel iostream.h).

Przyczyny problemu szukałem długo. W końcu znalazłem: otóż include-owałem także pewne pliki nagłówkowe Oracle. W jednym z nich (oratypes.h) jakiś niezwykle sympatyczny programista napisał co następuje:

    #define signed

A że standardowy plik limits zawierał niezależne instancjacje numeric_limits dla char, signed char i unsigned char, to pierwsze dwie przestały się dlań różnić. Co ciekawe includeowałem Oracle po plikach standardowych - ale kompilator do rozwijania template brał wszystkie pliki nagłówkowe wykorzytywane w danym pliku źródłowym.

Pomogło dopisywanie

    #undef signed

bezpośrednio po zaincludeowaniu nagłówków Oracle.

Problem z numeric_limits możemy mieć także w zupełnie innej sytuacji. W pliku windows.h (który w aplikacjach kompilowanych pod Windows dołącza się z różnych powodów niemal wszędzie) min i max zdefiniowane są jako makra. Spróbujmy wywołać numeric_limits::min... Tu potrzebne jest jeszcze

#undef min
#undef max

Podziękowania dla Krzysztofa Stachlewskiego za podesłanie informacji z powyższego akapitu.

komentarze obsługiwane przez Disqus