0.11 — Konfigurowanie kompilatora: Ostrzeżenie i poziomy błędów

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łaściwości Eksploratora rozwiązań

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):

Włącz ostrzeżenia poziomu 4

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:

Włącz wszystko Ostrzeżenia

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

Dodaj -W-konwersja

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łaściwości Eksploratora rozwiązań

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).

Traktuj ostrzeżenia jako błędy

W przypadku użytkowników Code::Blocks

Z Menu Ustawienia > Kompilator > zakładka Inne opcje kompilatora, dodaj -Werror do obszaru edycji tekstu:

Dodaj -Werror

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",
guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
322 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze