2009-11-29 19 views
11

Aktualnie otrzymuję ostrzeżenia kompilatora przypominające ostrzeżenie, które podałem w tytule pytania. Ostrzeżenia takie jak ....boost :: system :: (...) _ kategoria zdefiniowana, ale nie używana

warning: 'boost::system::generic_category' defined but not used

warning: 'boost::system::posix_category' defined but not used

warning: 'boost::system::errno_ecat' defined but not used

warning: 'boost::system::native_ecat' defined but not used

miarę Wiem, że program nie jest w żaden sposób. Nie lubię jednak ostrzeżeń, ale nie mam pojęcia, co te ostrzeżenia próbują mi powiedzieć, poza tym, że coś zdefiniowanego i związanego z doładowaniem jest gdzieś, gdzie nie jest używane. Jednak wszystko, co zdefiniowałem, wykorzystałem. Biblioteki doładowania, których używam, to biblioteka losowa i biblioteka systemów plików.

Po sprawdzeniu źródła ostrzeżenia pojawia się plik Boost's error_category.hpp i podświetla niektóre static const s, które są komentowane jako "wstępnie zdefiniowane kategorie błędów" lub "wycofane synonimy". Może problem ma coś wspólnego z obsługą błędów (lub ich brakiem) podczas korzystania z biblioteki?

Czy ktoś może dać wgląd w to, dlaczego te ostrzeżenia pojawiają się? Czy całkowicie mi czegoś brakuje?

P.S. Ostrzeżenia są na maksymalnym poziomie.

Odpowiedz

7

Dotyczy biblioteki kodów błędów w bibliotece Boost.System. Boost error_codes zawiera dwa atrybuty: wartości i kategorie. Aby kod błędu był rozszerzalny, aby użytkownicy bibliotek mogli projektować własne kategorie błędów, projektanci doładowania potrzebowali jakiegoś sposobu reprezentowania unikalnej kategorii kodów błędów. Prosty numer identyfikacyjny nie byłby wystarczający, ponieważ mogłoby to spowodować, że dwa projekty używają sprzecznych numerów identyfikacyjnych dla niestandardowych kategorii błędów.

Tak więc w zasadzie używali adresów pamięci w postaci obiektów statycznych, które dziedziczą po klasie bazowej error_category. Te zmienne w rzeczywistości nic nie robią, z wyjątkiem tego, że służą jako unikatowe identyfikatory określonej kategorii błędów. Ponieważ są to w zasadzie statyczne fałszywe obiekty z unikalnymi adresami w pamięci, możesz łatwo tworzyć własne niestandardowe kategorie błędów, które nie będą kolidować z innymi "identyfikatorami" kategorii błędów. Aby uzyskać więcej informacji, patrz here.

Przypuszczam, że to, co widzisz, jest efektem ubocznym tej decyzji projektowej. Ponieważ te zmienne nigdy nie są faktycznie używane w twoim programie, kompilator generuje ostrzeżenia. Wystarczy powiedzieć, nie sądzę, że robisz coś złego.

+0

Mam ten sam problem, ale mój linker nie kończy pracy, więc z pewnością wygląda jak duży problem, o ile widzę. – Rhubarb

+12

... z wyjątkiem tego, że nie można już używać '-Werror' z powodu tego, – vladr

20

Zgadzam się z @Charles Salvia, ale chciałem dodać, że przynajmniej z wersji Boost 1.44.0 te definicje są teraz opakowane - aby zostać wykluczonym jako przestarzałe. Więc jeśli ich nie używasz, po prostu dołącz następujące wiersze przed dołączeniem pliku nagłówkowego:

#ifndef BOOST_SYSTEM_NO_DEPRECATED 
#define BOOST_SYSTEM_NO_DEPRECATED 1 
#endif 
+0

Definiuję to, ale nie jest to zgniatanie ostrzeżeń. –

+2

To zadziałało dla mnie. –

+0

IMO to powinna być odpowiedź, lub użycie flagi -D kompilatora do określenia tego zdefiniowania. – ColinCren