Domyślnie wyłączone ostrzeżenia kompilatora

Kompilator obsługuje ostrzeżenia, które są domyślnie wyłączone, ponieważ większość deweloperów nie znajduje ich przydatnych. W niektórych przypadkach ostrzegają o wyborze stylistycznym lub o typowych idiomach w starszym kodzie. Inne ostrzeżenia dotyczą używania rozszerzenia firmy Microsoft do języka. Niektóre ostrzeżenia wskazują obszar, w którym programiści często tworzą nieprawidłowe założenia, co może prowadzić do nieoczekiwanego lub niezdefiniowanego zachowania. Jeśli wszystkie te ostrzeżenia są włączone, niektóre z nich mogą pojawiać się wiele razy w nagłówkach biblioteki. Biblioteki środowiska uruchomieniowego języka C i standardowe biblioteki języka C++ mają na celu emitowanie żadnych ostrzeżeń tylko na poziomie /W4ostrzeżenia .

Włączanie ostrzeżeń, które są domyślnie wyłączone

Ostrzeżenia, które są zwykle wyłączone domyślnie, można użyć jednej z następujących opcji:

  • #pragma warning(default :warning_number)

    Określone ostrzeżenie (warning_number) jest włączone na poziomie domyślnym. Dokumentacja dla ostrzeżenia zawiera domyślny poziom ostrzeżeń.

  • #pragma warning(:warning_level warning_number)

    Określone ostrzeżenie (warning_number) jest włączone na określonym poziomie (warning_level).

  • /Wall

    /Wall włącza wszystkie ostrzeżenia, które są domyślnie wyłączone. Jeśli używasz tej opcji, możesz wyłączyć poszczególne ostrzeżenia przy użyciu /wd opcji .

  • /wLNnnn

    Ta opcja włącza ostrzeżenie nnnn na poziomie L.

Ostrzeżenia wyłączone domyślnie

Visual Studio 2015 i nowsze wersje

Następujące ostrzeżenia są domyślnie wyłączone w programie Visual Studio 2015 i nowszych wersjach:

Ostrzeżenie Wiadomość
C4061 (poziom 4) moduł wyliczający "identyfikator" w przełączniku wyliczenia "wyliczenie" nie jest jawnie obsługiwany przez etykietę przypadku.
C4062 (poziom 4) Moduł wyliczający "identyfikator" w przełączniku wyliczenia "wyliczenie" nie jest obsługiwany.
C4165 (poziom 1) Wyrażenie "HRESULT" jest konwertowane na wartość "bool"; czy na pewno jest to, czego chcesz?
C4191 (poziom 3) "operator": niebezpieczna konwersja z "type_of_expression" na "type_required"
C4242 (poziom 4) "identifier": konwersja z "type1" na "type2", możliwa utrata danych
C4254 (poziom 4) "operator": konwersja z "type1" na "type2", możliwa utrata danych
C4255 (poziom 4) "function": brak prototypu funkcji: konwertowanie elementu "()" na "(void)"
C4263 (poziom 4) "function": funkcja składowa nie zastępuje żadnej funkcji wirtualnej składowej klasy bazowej
C4264 (poziom 1) "virtual_function": brak przesłonięcia dostępnego dla funkcji wirtualnej składowej z bazowej "klasy"; funkcja jest ukryta
C4265 (poziom 3) "klasa": klasa ma funkcje wirtualne, ale destruktor nie jest wirtualny
C4266 (poziom 4) "function": brak przesłonięcia dostępnego dla wirtualnej funkcji składowej z bazowego "type"; funkcja jest ukryta
C4287 (poziom 3) "operator": niezgodność niepodpisanej/ujemnej stałej
C4289 (poziom 4) niestandardowe rozszerzenie używane: "var" : zmienna sterowania pętli zadeklarowana w pętli for-loop jest używana poza zakresem pętli for-loop
C4296 (poziom 4) "operator": wyrażenie jest zawsze fałszywe
C4339 (poziom 4) "type" : użycie niezdefiniowanego typu wykrytego w metadanych CLR — użycie tego typu może prowadzić do wyjątku środowiska uruchomieniowego
C4342 (poziom 1) zmiana zachowania: "funkcja" wywoływana, ale operator elementu członkowskiego został wywołany w poprzednich wersjach
C4350 (poziom 1) zmiana zachowania: "member1" o nazwie zamiast "member2"
C4355 'this': używany na liście inicjatora bazowego elementu członkowskiego
C4365 (poziom 4) "action": konwersja z "type_1" na "type_2", niezgodność podpisanych/niepodpisanych
C4370 (poziom 3) układ klasy zmienił się z poprzedniej wersji kompilatora ze względu na lepsze pakowanie
C4371 (poziom 3) "nazwa-klasy": układ klasy mógł ulec zmianie z poprzedniej wersji kompilatora z powodu lepszego pakowania składowej "składowej"
C4388 (poziom 4) niezgodność ze znakiem/bez znaku
C4412 (poziom 2) "function": podpis funkcji zawiera typ "type"; Obiekty języka C++ są niebezpieczne do przekazywania między czystym kodem a mieszanym lub natywnym
C4426 (poziom 1) flagi optymalizacji zmienione po włączeniu nagłówka mogą być spowodowane #pragma optimize() 14.1
C4435 (poziom 4) "class1" : układ obiektu w /vd2 zmieni się z powodu wirtualnej bazy "class2".
C4437 (poziom 4) dynamic_cast z wirtualnej bazy "class1" do "class2" może zakończyć się niepowodzeniem w niektórych kontekstach.
C4444 (poziom 3) W tym kontekście nie zaimplementowano __unaligned najwyższego poziomu.
C4464 (poziom 4) względna ścieżka dołączania zawiera '.'
C4471 (poziom 4) a forward deklaracji wyliczenia niezakresowego musi mieć typ bazowy (int zakładane) Perm
C4472 (poziom 1) "identifier" to natywne wyliczenie: dodawanie specyfikatora dostępu (prywatny/publiczny) w celu zadeklarowania zarządzanego wyliczenia
C4514 (poziom 4) "function": funkcja nieużywaną w tekście została usunięta
C4536 (poziom 4) "nazwa typu": typ-nazwa przekracza limit metadanych znaków "limit" znaków
C4545 (poziom 1) wyrażenie przed przecinkiem daje w wyniku funkcję, dla której brakuje listy argumentów
C4546 (poziom 1) wywołanie funkcji przed przecinkiem, brak listy argumentów
C4547 (poziom 1) "operator": operator przed przecinkiem nie ma wpływu; oczekiwany operator z efektem ubocznym
C4548 (poziom 1) wyrażenie przed przecinkiem nie przynosi efektu; oczekiwane wyrażenie, który przynosi efekt
C4549 (poziom 1) "operator1": operator przed przecinek nie ma wpływu; czy zamierzasz "operator2"?
C4555 (poziom 1) wyrażenie nie przynosi efektu; oczekiwane wyrażenie, który przynosi efekt
C4557 (poziom 3) "__assume" zawiera efekt "efekt"
C4571 (poziom 4) informational: catch(...) semantyka zmieniła się od visual C++ 7.1; wyjątki ustrukturyzowane (SEH) nie są już przechwytywane
C4574 (poziom 4) "identyfikator" jest zdefiniowany jako "0": czy oznacza się użycie identyfikatora "#if"?
C4577 (poziom 1) "noexcept" używany bez określonego trybu obsługi wyjątków; zakończenie wyjątku nie jest gwarantowane. Określić /EHsc
C4582 (poziom 4) "type": konstruktor nie jest niejawnie wywoływany
C4583 (poziom 4) "type": destruktor nie jest niejawnie wywoływany
C4587 (poziom 1) "anonymous_structure": zmiana zachowania: konstruktor nie jest już niejawnie wywoływany
C4588 (poziom 1) "anonymous_structure": zmiana zachowania: destruktor nie jest już niejawnie wywoływany
C4596 (poziom 4) "identifier": nielegalna kwalifikowana nazwa w deklaracji składowej 14.3Perm
C4598 (poziom 1 i poziom 3) "#include "header": nagłówek-numer nagłówka w prekompilowanej nagłówku nie pasuje do bieżącej kompilacji na tej pozycji 14.3
C4599 (poziom 3) "ścieżka opcji": numer argumentu wiersza polecenia arg_number nie pasuje do wstępnie skompilowanego nagłówka 14.3
C4605 (poziom 1) Makro "/D" określone w bieżącym wierszu polecenia, ale nie zostało określone podczas kompilacji prekompilowanego nagłówka
C4608 (poziom 3) "union_member" został już zainicjowany przez innego członka unii na liście inicjatorów, "union_member" Perm
C4619 (poziom 3) #pragma ostrzeżenie: nie ma numeru ostrzeżenia "number"
C4623 (poziom 4) „klasa pochodna”: nie można wygenerować konstruktora domyślnego, ponieważ domyślny konstruktor klasy bazowej jest niedostępny
C4625 (poziom 4) „klasa pochodna”: nie można wygenerować konstruktora kopiowania, ponieważ konstruktor kopiowania klasy bazowej jest niedostępny
C4626 (poziom 4) „klasa pochodna”: nie można wygenerować operatora przypisania, ponieważ operator przypisania klasy bazowej jest niedostępny
C4628 (poziom 1) dwuznaki nieobsługiwane z -Ze. Sekwencja znaków "digraph" nie jest interpretowana jako token alternatywny dla znaku
C4640 (poziom 3) "instance": konstruowanie lokalnego obiektu statycznego nie jest bezpieczne wątkowo
C4643 (poziom 4) Przekazywanie deklarowania "identyfikatora" w std przestrzeni nazw nie jest dozwolone przez standard C++. 15.8
C4647 (poziom 3) zmiana zachowania: __is_pod(typ) ma inną wartość w poprzednich wersjach
C4654 (poziom 4) Kod umieszczony przed dołączeniem wstępnie skompilowanego wiersza nagłówka zostanie zignorowany. Dodaj kod do prekompilowanego nagłówka. 14.1
C4668 (poziom 4) Symbol nie jest zdefiniowany jako makro preprocesora, zastępując element "0" dla "dyrektyw"
C4682 (poziom 4) "symbol" : nie określono atrybutu parametru kierunkowego, domyślnie na [in]
C4686 (poziom 3) "Typ zdefiniowany przez użytkownika": możliwa zmiana zachowania, zmiana konwencji wywołania zwrotnego UDT
C4692 (poziom 1) "function": podpis elementu członkowskiego innego niż prywatny zawiera prywatny typ natywny zestawu "native_type"
C4710 (poziom 4) "function": funkcja nie jest podkreśnięta
C4738 (poziom 3) przechowywanie 32-bitowego wyniku zmiennopozycyjnego w pamięci, możliwa utrata wydajności
C4746 nietrwały dostęp do wyrażenia podlega ustawieniom /volatile:<iso|ms>; rozważ użycie funkcji wewnętrznych __iso_volatile_load/store
C4749 (poziom 4) obsługiwane warunkowo: przesunięcie zastosowane do typu "type" innego niż standardowy
C4767 (poziom 4) nazwa sekcji "symbol" jest dłuższa niż 8 znaków i zostanie obcięta przez konsolidator
C4774 (poziom 4) "string" : ciąg formatu oczekiwany w liczbie argumentów nie jest literałem ciągu
C4777 (poziom 4) "function": ciąg formatu "string" wymaga argumentu typu "type1", ale liczba argumentów wariadycznych ma typ "type2"
C4786 (poziom 3) "symbol" : nazwa obiektu została obcięta na znaki "number" w informacjach debugowania
C4800 (poziom 4) Niejawna konwersja z typu na wartość logiczną. Możliwa utrata informacji 16.0
C4820 (poziom 4) Dopełnienie bajtów "bajtów" dodane po konstrukcji "member_name"
C4822 (poziom 1) "składowa": funkcja składowa klasy lokalnej nie ma treści
C4826 (poziom 2) Konwersja z "type1" na "type2" jest rozszerzona o znak. Może to spowodować nieoczekiwane zachowanie środowiska uruchomieniowego.
C4837 (poziom 4) wykryto trójznak: znak?? zastąpiony znakiem "znak"
C4841 (poziom 4) nietypowe używane rozszerzenie: projektator składowych złożonych używany w offsetof
C4842 (poziom 4) wynik "offsetof" zastosowany do typu używającego wielu dziedziczenia nie gwarantuje spójności między wydaniami kompilatora
C4866 (poziom 4) Kompilator "file(line-number)" może nie wymuszać kolejności oceny od lewej do prawej dla wywołania operatora
C4868 (poziom 4) Kompilator "file(line_number)" może nie wymuszać kolejności oceny od lewej do prawej na liście inicjowania nawiasów klamrowych
C4905 (poziom 1) literał ciągu dwubajtowego rzutowany na 'LPSTR'
C4906 (poziom 1) literał ciągu rzutowany na 'LPWSTR'
C4917 (poziom 1) Deklarator: identyfikator GUID może być skojarzony tylko z klasą, interfejsem lub przestrzenią nazw
C4928 (poziom 1) nieprawidłowe inicjowanie kopiowania; niejawnie zastosowano więcej niż jedną konwersję zdefiniowaną przez użytkownika
C4931 (poziom 4) zakładamy, że biblioteka typów została zbudowana dla wskaźników liczba-bit
C4946 (poziom 1) reinterpret_cast używane między powiązanymi klasami: "class1" i "class2"
C4962 "function": optymalizacje sterowane profilem są wyłączone, ponieważ optymalizacje spowodowały, że dane profilu stały się niespójne
C4986 (poziom 4) "symbol": specyfikacja wyjątku nie jest zgodna z poprzednią deklaracją
C4987 (poziom 4) użyto rozszerzenia niestandardowego: 'throw (...)'
C4988 (poziom 4) "symbol": zmienna zadeklarowana poza zakresem klasy/funkcji
C5022 "type": określono wiele konstruktorów przenoszenia
C5023 "type": określono wiele operatorów przypisania przenoszenia
C5024 (poziom 4) "type": konstruktor przenoszenia został niejawnie zdefiniowany jako usunięty
C5025 (poziom 4) "type": operator przypisania przenoszenia został niejawnie zdefiniowany jako usunięty
C5026 (poziom 1 i poziom 4) "type": konstruktor przenoszenia został niejawnie zdefiniowany jako usunięty
C5027 (poziom 1 i poziom 4) "type": operator przypisania przenoszenia został niejawnie zdefiniowany jako usunięty
C5029 (poziom 4) używane niestandardowe rozszerzenie: atrybuty wyrównania w języku C++ mają zastosowanie tylko do zmiennych, elementów członkowskich danych i typów tagów
C5031 (poziom 4) #pragma ostrzeżenie (pop): prawdopodobnie niezgodność, wyskakujące ostrzeżenie stanu wypychane w innym pliku 14.1
C5032 (poziom 4) wykryto ostrzeżenie #pragma (wypychanie) bez odpowiedniego ostrzeżenia #pragma (pop) 14.1

Visual Studio 2017 i nowsze wersje

Następujące ostrzeżenia są domyślnie wyłączone w programie Visual Studio 2017 i nowszych wersjach:

Ostrzeżenie Wiadomość
C5034 użycie wewnętrznego "wewnętrznego" powoduje, że nazwa funkcji funkcji jest kompilowana jako kod gościa 15.3
C5035 użycie funkcji "feature" powoduje, że nazwa funkcji jest kompilowana jako kod gościa 15.3
C5036 (poziom 1) konwersja wskaźnika funkcji varargs podczas kompilowania z /hybrid:x86arm64 "type1" do "type2" 15.3
C5038 (poziom 4) element członkowski danych "member1" zostanie zainicjowany po składowej danych "member2" 15.3
C5039 (poziom 4) "function": wskaźnik lub odwołanie do potencjalnie zgłaszającej funkcję przekazaną do funkcji extern C w obszarze -EHc. Niezdefiniowane zachowanie może wystąpić, jeśli ta funkcja zgłasza wyjątek. 15.5
C5041 (poziom 4) "member-name": definicja poza wierszem dla elementu członkowskiego danych statycznych constexpr nie jest potrzebna i jest przestarzała w języku C++17. 15.2
C5042 (poziom 3) "function": deklaracje funkcji w zakresie bloku nie mogą być określone jako "wbudowane" w standardowym języku C++; usuń specyfikator "wbudowany" 15.5
C5045 Kompilator wstawi ograniczenie ryzyka spectre dla obciążenia pamięci, jeśli przełącznik /Qspectre określony 15.7

Visual Studio 2019 i nowsze wersje

Następujące ostrzeżenia są domyślnie wyłączone w programie Visual Studio 2019 i nowszych wersjach:

Ostrzeżenie Wiadomość
C5052 (poziom 3) Słowo kluczowe "nazwa słowa kluczowego" zostało wprowadzone w wersji języka C++ i wymaga użycia opcji wiersza polecenia "option" 16.1
C5204 (poziom 3) Klasa z funkcjami wirtualnymi ma niewirtualny destruktor trywialny. 16.5
C5214 (poziom 4) stosowanie słowa kluczowego do operandu z nietrwałym typem kwalifikowanym jest przestarzałe w języku C++20 16.7
C5215 (poziom 4) "function-parameter" parametr funkcji z nietrwałym typem kwalifikowanym jest przestarzały w języku C++20 16.7
C5216 (poziom 4) "return-type" nietrwały kwalifikowany typ zwracany jest przestarzały w języku C++20 16.7
C5217 (poziom 4) ustrukturyzowana deklaracja powiązania zawierająca zmienną jest przestarzała w języku C++20 16.7
C5219 (poziom 2) niejawna konwersja z "type-1" na "type-2", możliwa utrata danych 16.7
C5220 (poziom 4) "element członkowski": niestatyczny element członkowski danych z nietrwałym typem kwalifikowanym nie oznacza już, że
Konstruktory kopii/przenoszenia generowane przez kompilator i operatory przypisania kopiowania/przenoszenia nie są proste 16.7
C5233 (poziom 4) jawne przechwytywanie lambda "identifier" nie jest używane 16.10
C5240 (poziom 4) "attribute-name": atrybut jest ignorowany w tej pozycji składni 16.10
C5243 (poziom 1) "type-name": użycie niekompletnej klasy "class-name" może spowodować potencjalne naruszenie reguły definicji z powodu ograniczenia ABI 16.10
C5245 (poziom 4) "function": funkcja niereferencja z wewnętrznym połączeniem została usunięta
C5246 (poziom 1) "member": inicjowanie podobiektu powinno być opakowane w nawiasy klamrowe 16.10
C5247 (poziom 1) Sekcja "section-name" jest zarezerwowana dla inicjowania dynamicznego języka C++. Ręczne tworzenie sekcji zakłóca inicjowanie dynamiczne języka C++ i może prowadzić do niezdefiniowanego zachowania 16.11
C5248 (poziom 1) Sekcja "section-name" jest zarezerwowana dla inicjowania dynamicznego języka C++. Zmienna ręcznie umieszczona w sekcji może zostać zoptymalizowana, a jego kolejność względem kompilatora wygenerowanych dynamicznych inicjatorów nie jest określona 16.11

Visual Studio 2022 i nowsze wersje

Następujące ostrzeżenia są domyślnie wyłączone w programie Visual Studio 2022 i nowszych wersjach:

Ostrzeżenie Wiadomość
C5249 (poziom 1) Pole bitowe typu "enumeration_name" ma nazwane moduły wyliczające o wartościach, których nie można przedstawić w danej szerokości pola bitowego "bitfield_width". 17.0
C5250 (poziom 3) "function_name": funkcja wewnętrzna nie jest zadeklarowana. 17.0
C5251 (poziom 4) nazwa segmentu została zmieniona po włączeniu nagłówka 17.1
C5254 (poziom 4) Funkcja języka "terse static assert" wymaga flagi kompilatora "/std:c++17" 17.1
C5256 (poziom 1) "wyliczenie": deklaracja niezdefiniowania wyliczenia ze stałym typem bazowym jest dozwolona tylko jako deklaracja autonomiczna 17.2
C5258 (poziom 4) jawne przechwytywanie symbolu nie jest wymagane dla tego użycia 17.2
C5259 (poziom 4) "wyspecjalizowany typ": jawna specjalizacja wymaga "template <>" 17.3
C5262 (poziom 1, błąd) występuje tutaj niejawny upadek; Czy brakuje instrukcji break ? Użyj [[fallthrough]] , gdy break instrukcja jest celowo pomijana między przypadkami 17.4
C5263 (poziom 4) wywoływanie elementu "std::move" w obiekcie tymczasowym uniemożliwia kopiowanie elizji 17.4
C5264 (poziom 4) "nazwa-zmiennej": zmienna "const" nie jest używana w wersji 17.4
C5266 (poziom 4) Kwalifikator "const" w typie powrotu nie ma wpływu 17.6
C5267 (poziom 4) definicja niejawnego konstruktora/operatora przypisania dla "typu" jest przestarzała, ponieważ ma operatora przypisania dostarczonego przez użytkownika/konstruktora kopiowania 17.7

14.1 To ostrzeżenie jest dostępne począwszy od programu Visual Studio 2015 Update 1.
14.3 To ostrzeżenie jest dostępne, począwszy od programu Visual Studio 2015 Update 3.
15.2 To ostrzeżenie jest dostępne od wersji 15.2 programu Visual Studio 2017.
15.3 To ostrzeżenie jest dostępne od wersji 15.3 programu Visual Studio 2017.
15.5 To ostrzeżenie jest dostępne od wersji 15.5 programu Visual Studio 2017.
15.7 To ostrzeżenie jest dostępne od wersji 15.7 programu Visual Studio 2017.
15.8 To ostrzeżenie jest dostępne od wersji 15.8 programu Visual Studio 2017.
16.0 To ostrzeżenie jest dostępne począwszy od programu Visual Studio 2019 RTM.
16.5 To ostrzeżenie jest dostępne od wersji 16.5 programu Visual Studio 2019.
16.7 To ostrzeżenie jest dostępne od wersji 16.7 programu Visual Studio 2019.
16.10 To ostrzeżenie jest dostępne od wersji 16.10 programu Visual Studio 2019.
16.11 To ostrzeżenie jest dostępne od wersji 16.11 programu Visual Studio 2019.
17.0 To ostrzeżenie jest dostępne od wersji 17.0 programu Visual Studio 2022.
17.1 To ostrzeżenie jest dostępne od wersji 17.1 programu Visual Studio 2022.
17.2 To ostrzeżenie jest dostępne od wersji 17.2 programu Visual Studio 2022.
17.3 To ostrzeżenie jest dostępne od wersji 17.3 programu Visual Studio 2022.
17.4 To ostrzeżenie jest dostępne od wersji 17.4 programu Visual Studio 2022.
17.5 To ostrzeżenie jest dostępne od wersji 17.5 programu Visual Studio 2022.
17.6 To ostrzeżenie jest dostępne od wersji 17.6 programu Visual Studio 2022.
17.7 To ostrzeżenie jest dostępne od wersji 17.7 programu Visual Studio 2022.
Perm To ostrzeżenie jest wyłączone, chyba że /permissive- opcja kompilatora jest ustawiona.

Ostrzeżenia są domyślnie wyłączone we wcześniejszych wersjach

To ostrzeżenie było domyślnie wyłączone w programie Visual Studio 2015 w wersji 15.3 i włączone w programie Visual Studio 2015 w wersji 15.5:

Ostrzeżenie Wiadomość
C4768 __declspec atrybuty przed specyfikacją połączenia są ignorowane

Te ostrzeżenia były domyślnie wyłączone w wersjach kompilatora przed programem Visual Studio 2015:

Ostrzeżenie Wiadomość
C4302 (poziom 2) "konwersja": obcięcie z "type1" do "type2"
C4311 (poziom 1) "zmienna": obcięcie wskaźnika z "type" do "type"
C4312 (poziom 1) "operation": konwersja z "type1" na "type2" o większym rozmiarze
C4319 (poziom 1) "operator": zero rozszerzające "type1" na "type2" o większym rozmiarze

To ostrzeżenie było domyślnie wyłączone w wersjach kompilatora przed programem Visual Studio 2012:

Ostrzeżenie Wiadomość
C4431 (poziom 4) brak specyfikatora typu — zakładany int. Uwaga: C nie obsługuje już domyślnego int

Zobacz też

warning Pragmy