Kiedy piszesz programy, kompilator sprawdzi, czy przestrzegasz zasad języka C++ (zakładając, że skończyłeś wyłączone rozszerzenia kompilatora, zgodnie z lekcją 0.10 -- Konfigurowanie kompilatora: Rozszerzenia kompilatora). Jeśli zrobiłeś coś, co definitywnie narusza zasady języka, to twój program jest źle sformułowany.
W większości przypadków, gdy kompilator napotka jakiś problem, wyemituje komunikat diagnostyczny (często nazywany diagnostyką w skrócie). Standard C++ nie definiuje, w jaki sposób komunikaty diagnostyczne powinny być kategoryzowane, sformułowane ani jak te problemy powinny wpływać na kompilację programu. Jednak współczesne kompilatory tradycyjnie przyjęły następujące zasady:
- A błąd diagnostyczny (błąd w skrócie) oznacza, że kompilator zdecydował się zatrzymać kompilację, ponieważ albo nie może kontynuować kompilacji, albo uważa, że błąd jest na tyle poważny, że można go zatrzymać. Błędy diagnostyczne generowane przez kompilator nazywane są często błędami kompilacji, błędami kompilatora lub błędami kompilacji.
- A ostrzeżeniem diagnostycznym (ostrzeżeniem w skrócie) oznaczają, że kompilator zdecydował się nie wstrzymywać kompilacji. W takich przypadkach problem jest po prostu ignorowany i kompilacja jest kontynuowana.
Kluczowa informacja
Kompilatory ustalają, czy problem nieblokujący jest ostrzeżeniem, czy błędem. Chociaż zazwyczaj są one zgodne w swojej kategoryzacji, w niektórych przypadkach kompilatory mogą się nie zgodzić — jeden kompilator emituje błąd, a inny kompilator emituje ostrzeżenie dotyczące tego samego problemu.
Aby pomóc Ci określić, gdzie leży problem, komunikaty diagnostyczne zazwyczaj zawierają zarówno nazwę pliku, jak i numer wiersza, w którym kompilator znalazł problem, oraz tekst określający, czego oczekiwano i co znaleziono. Rzeczywisty problem może znajdować się w tym wierszu lub w wierszu poprzedzającym. Po rozwiązaniu problemu powodującego diagnostykę możesz spróbować ponownie skompilować, aby sprawdzić, czy powiązany komunikat diagnostyczny nie jest już generowany.
W niektórych przypadkach kompilator może zidentyfikować kod, który nie narusza zasad języka, ale jego zdaniem może być nieprawidłowy. W takich przypadkach kompilator może zdecydować się na wyemitowanie ostrzeżenia dla programisty, że coś jest nie tak. Takie problemy można rozwiązać albo naprawiając problem, na który wskazuje ostrzeżenie, albo przepisując niewłaściwe linie kodu w taki sposób, że ostrzeżenie nie jest już generowane.
Dla zaawansowanych czytelników
Pokazujemy przykład instrukcji, która jest technicznie legalna, ale współczesne kompilatory wydają się podejrzane w lekcji 7.7 -- Powiązania zewnętrzne i deklaracje zmiennych forward.
W rzadkich przypadkach może być konieczne wyraźne poinformowanie kompilatora, aby nie generował szczególne ostrzeżenie dotyczące danego wiersza kodu. C++ nie obsługuje oficjalnego sposobu, aby to zrobić, ale wiele indywidualnych kompilatorów (w tym Visual Studio i GCC) oferuje rozwiązania (poprzez nieprzenośne dyrektywy #pragma) umożliwiające tymczasowe wyłączenie ostrzeżeń.
Najlepsza praktyka
Nie pozwól, aby ostrzeżenia się piętrzyły. Rozwiązuj je, gdy je napotkasz (jakby były błędami). W przeciwnym razie ostrzeżenie o poważnym problemie może zostać utracone wśród ostrzeżeń o mniej poważnych problemach.
Konsolidator może również generować błędy diagnostyczne, jeśli podczas łączenia wystąpi problem, którego nie można rozwiązać.
Zwiększanie poziomów ostrzeżeń
Domyślnie większość kompilatorów będzie generować ostrzeżenia tylko o najbardziej oczywistych problemach. Możesz jednak poprosić kompilator, aby był bardziej stanowczy w dostarczaniu ostrzeżeń i ogólnie jest to dobry pomysł.
Najlepsza praktyka
Podnieś poziom ostrzeżeń, szczególnie podczas nauki. Dodatkowe informacje diagnostyczne mogą pomóc w identyfikacji błędów programistycznych, które mogą spowodować nieprawidłowe działanie programu.
W przypadku użytkowników programu Visual Studio
Aby zwiększyć poziomy ostrzeżeń, kliknij prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań oknie, a następnie wybierz Właściwości:

W oknie dialogowym Projekt , najpierw upewnij się, że pole Konfiguracja jest ustawione ustaw na Wszystkie konfiguracje.
Następnie wybierz C/C++ > zakładka Ogólne i ustaw Poziom ostrzeżeń Do Poziom4 (/W4):

Uwaga: Nie rób tego wybierz Włącz wszystkie ostrzeżenia (/Wall) w przeciwnym razie zostaniesz pochowany w ostrzeżeniach generowanych przez standardową bibliotekę C++.
Visual Studio domyślnie wyłącza ostrzeżenia o konwersji ze znakiem/niepodpisanym i są one przydatne, więc jeśli używasz programu Visual Studio 2019 lub nowszego, włączmy te:
- Z C/C++ > zakładka Wiersz poleceń, w Opcje dodatkowe, dodaj
/w44365. To informuje kompilator, aby włączył ostrzeżenia o konwersji ze znakiem/niepodpisanym na poziomie ostrzeżenia 4 (który włączyłeś powyżej). - Z C/C++ > karta Zewnętrzne zawiera, ustaw Poziom ostrzeżenia nagłówka zewnętrznego Do Poziom3 (/external:W3). Mówi to kompilatorowi, aby skompilował nagłówki bibliotek standardowych na poziomie ostrzeżenia 3 (zamiast 4), tak aby kompilacja tych nagłówków nie wywołała tego ostrzeżenia.
Karta „Zawiera zewnętrzne” nie jest pokazana na powyższej grafice, ale pojawia się w VS Community 2019 lub nowszym pomiędzy kartami „Przeglądaj informacje” i „Zaawansowane”. Zobacz ten link, który zawiera najnowsze zdjęcie okna dialogowego zawierającego zakładkę „External Zawiera”.
Jeśli powyższe zostało ustawione poprawnie, kompilacja poniższego programu powinna wygenerować ostrzeżenie C4365:
void foo(int)
{
}
int main()
{
unsigned int x { 5 };
foo(x);
return 0;
}Jeśli nie widzisz ostrzeżenia, sprawdź oba Wyjście i Błąd Lista kart (jeśli istnieją).
W przypadku użytkowników Code::Blocks
Z menu Ustawienia > Kompilator > zakładka Ustawienia kompilatora znajdź i sprawdź powiązane opcje with -Wall, -Weffc++, I -Wextra:

Następnie przejdź do zakładki Inne opcje kompilatora i dodaj -Wconversion -Wsign-conversion do poniższej edycji tekstu area:

Uwaga: Symbol -Werror parametr wyjaśniono poniżej.
Dla użytkowników gcc
Dodaj następujące flagi do linii poleceń: -Wall -Weffc++ -Wextra -Wconversion -Wsign-conversion
Dla użytkowników VS Code
Otwórz plik task.json, znajdź „args”, a następnie zlokalizuj wiersz „${file}” w tej sekcji.
Nad wierszem „${file}” , dodaj nowe wiersze zawierające następujące polecenia (po jednym w wierszu):
"-Wall", "-Weffc++", "-Wextra", "-Wconversion", "-Wsign-conversion",
Traktuj ostrzeżenia jako błędy
Można także powiedzieć kompilatorowi, aby traktował wszystkie ostrzeżenia tak, jakby były błędami (w takim przypadku kompilator zatrzyma kompilację, jeśli znajdzie jakieś ostrzeżenia). Jest to dobry sposób na wyegzekwowanie zalecenia naprawienia wszystkich ostrzeżeń (jeśli brakuje Ci samodyscypliny, a której brakuje większości z nas).
Najlepsza praktyka
Włącz opcję „Traktuj ostrzeżenia jako błędy”. To wymusi rozwiązanie wszystkich problemów powodujących ostrzeżenia.
W przypadku użytkowników programu Visual Studio
Aby traktować ostrzeżenia jako błędy, kliknij prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań oknie, a następnie wybierz Właściwości:

W oknie dialogowym Projekt , najpierw upewnij się, że pole Konfiguracja jest ustawione ustaw na Wszystkie konfiguracje.
Następnie wybierz C/C++ > zakładka Ogólne i ustaw Traktuj ostrzeżenia jako błędy Do Tak (/WX).

W przypadku użytkowników Code::Blocks
Z Menu Ustawienia > Kompilator > zakładka Inne opcje kompilatora, dodaj -Werror do obszaru edycji tekstu:

Dla użytkowników gcc
Dodaj następującą flagę do swojego polecenia linia: -Werror
Dla użytkowników VS Code
W tasks.json file, dodaj następujące flagi przed „${file}”, po jednej w linii:
"-Werror",

