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.
- «Zawsze zapomnisz posprzątać, lepiej niech kompilator sprzątnie za Ciebie
- Ostrożnie z c_str na obiekcie tymczasowym»
- ↑C++ - sztuczki i niebezpieczeństwa