Konfigurowanie projektu w języku C++ pod kątem funkcji IntelliSense

W niektórych przypadkach może być konieczne ręczne skonfigurowanie projektu C++, aby funkcja IntelliSense działała prawidłowo. W przypadku projektów MSBuild (na podstawie plików vcxproj) można dostosować ustawienia we właściwościach projektu. W przypadku projektów innych niż MSBuild ustawienia można dostosować w pliku CppProperties.json w katalogu głównym projektu. W niektórych przypadkach może być konieczne utworzenie pliku wskazówek, aby ułatwić funkcji IntelliSense zrozumienie definicji makr. Środowisko IDE programu Visual Studio ułatwia identyfikowanie i rozwiązywanie problemów z funkcją IntelliSense.

Funkcja IntelliSense z jednym plikiem

Po otwarciu pliku, który nie jest uwzględniony w projekcie, program Visual Studio zapewnia obsługę funkcji IntelliSense, ale domyślnie nie są wyświetlane żadne zygzaków błędów. Jeśli na pasku nawigacyjnym jest wyświetlany komunikat Różne pliki, prawdopodobnie wyjaśniono, dlaczego nie widzisz zygzaków błędów w nieprawidłowym kodzie lub dlaczego makro preprocesora nie jest zdefiniowane.

Sprawdzanie listy błędów

Jeśli plik nie jest otwarty w trybie pojedynczego pliku, a funkcja IntelliSense nie działa poprawnie, pierwszym miejscem do sprawdzenia jest okno Lista błędów. Aby wyświetlić wszystkie błędy funkcji IntelliSense dla bieżącego pliku źródłowego wraz ze wszystkimi dołączonymi plikami nagłówków, wybierz pozycję Build + IntelliSense na liście rozwijanej:

VC++ IntelliSense in Error List

Funkcja IntelliSense generuje maksymalnie 1000 błędów. Jeśli w plikach nagłówkowych uwzględnionych w pliku źródłowym występuje ponad 1000 błędów, plik źródłowy wyświetla tylko jeden przełącznik błędu na samym początku pliku źródłowego.

Upewnij się, że ścieżki #include są poprawne

Projekty MSBuild

Jeśli uruchamiasz kompilacje poza środowiskiem IDE programu Visual Studio, a kompilacje kończą się powodzeniem, ale funkcja IntelliSense jest niepoprawna, możliwe, że wiersz polecenia nie jest zsynchronizowany z ustawieniami projektu dla co najmniej jednej konfiguracji. Kliknij prawym przyciskiem myszy węzeł projektu w Eksplorator rozwiązań i upewnij się, że wszystkie ścieżki #include są poprawne dla bieżącej konfiguracji i platformy. Jeśli ścieżki są identyczne we wszystkich konfiguracjach i platformach, możesz wybrać pozycję Wszystkie konfiguracje i Wszystkie platformy, a następnie sprawdzić, czy ścieżki są poprawne.

VC++ Include Directories

Aby wyświetlić bieżące wartości makr kompilacji, takich jak VC_IncludePath, wybierz wiersz Uwzględnij katalogi i kliknij listę rozwijaną po prawej stronie. Następnie wybierz pozycję <Edytuj> i kliknij przycisk Makra .

Projekty pliku reguł dla programu make

W przypadku projektów makefile opartych na szablonie projektu NMake wybierz pozycję NMake w okienku po lewej stronie, a następnie wybierz pozycję Uwzględnij ścieżkę wyszukiwania w kategorii IntelliSense :

Makefile project include paths

Otwieranie folderu projektów

W przypadku projektów CMake upewnij się, że ścieżki #include są poprawnie określone dla wszystkich konfiguracji w pliku CMakeLists.txt. Inne typy projektów mogą wymagać pliku CppProperties.json. Aby uzyskać więcej informacji, zobacz Configure IntelliSense with CppProperties.json (Konfigurowanie funkcji IntelliSense przy użyciu pliku CppProperties.json). Upewnij się, że ścieżki są poprawne dla każdej konfiguracji zdefiniowanej w pliku.

Jeśli w pliku CppProperties.json wystąpi błąd składni, funkcja IntelliSense w plikach, których dotyczy problem, będzie niepoprawna. Program Visual Studio wyświetli błąd w oknie danych wyjściowych.

Problemy z analizatorem tagów

Analizator tagów to "rozmyty" analizator języka C++, który jest używany do przeglądania i nawigacji. Jest bardzo szybki, ale nie próbuje całkowicie zrozumieć każdej konstrukcji kodu.

Na przykład nie ocenia makr preprocesora i dlatego może niepoprawnie analizować kod, który sprawia, że są one intensywnie używane. Gdy analizator tagów napotka nieznaną konstrukcję kodu, może pominąć cały region kodu.

Istnieją dwa typowe sposoby manifestów tego problemu w programie Visual Studio:

  1. Jeśli na pasku nawigacyjnym jest wyświetlane najbardziej wewnętrzne makro, bieżąca definicja funkcji została pominięta:

    Tag parser skips function definition

  2. Środowisko IDE oferuje utworzenie definicji funkcji dla funkcji, która jest już zdefiniowana:

    Tag parser offers to define existing function

Aby rozwiązać tego rodzaju problemy, dodaj plik o nazwie cpp.hint do katalogu głównego katalogu rozwiązania. Aby uzyskać więcej informacji, zobacz Hint Files (Pliki wskazówek).

Błędy analizatora tagów są wyświetlane w oknie Lista błędów.

Weryfikowanie ustawień projektu przy użyciu rejestrowania diagnostycznego

Aby sprawdzić, czy kompilator intelliSense używa poprawnych opcji kompilatora, w tym makr dołączania ścieżek i preprocesora, włącz rejestrowanie diagnostyczne wierszy poleceń funkcji IntelliSense w oknie Narzędzia > Opcje > edytora > tekstów C/C++ > Advanced > Diagnostic Logging. Ustaw wartość Włącz rejestrowanie na wartość True, poziom rejestrowania na 5 (najbardziej pełny) i filtr rejestrowania na wartość 8 (rejestrowanie funkcji IntelliSense).

W oknie Dane wyjściowe będą teraz wyświetlane wiersze polecenia, które są przekazywane do kompilatora funkcji IntelliSense. Oto przykładowe dane wyjściowe:

[IntelliSense] Configuration Name: Debug|Win32
[IntelliSense] Toolset IntelliSense Identifier:
[IntelliSense] command line options:
/c
/I.
/IC:\Repo\Includes
/DWIN32
/DDEBUG
/D_DEBUG
/Zc:wchar_t-
/Zc:forScope
/Yustdafx.h

Te informacje mogą ułatwić zrozumienie, dlaczego funkcja IntelliSense dostarcza niedokładne informacje. Jeśli na przykład katalog Include projektu zawiera wartość $(MyVariable)\Include, a w dzienniku diagnostycznym jest wyświetlana ścieżka dołączania /I\Include , oznacza to, że wartość $(MyVariable) nie została obliczona i została usunięta z końcowej ścieżki dołączania.

Informacje o kompilacji funkcji IntelliSense

Program Visual Studio używa dedykowanego kompilatora języka C++, aby utworzyć i obsługiwać bazę danych, która obsługuje wszystkie funkcje funkcji IntelliSense. Aby zachować synchronizację bazy danych IntelliSense z kodem, program Visual Studio automatycznie uruchamia kompilacje tylko intelliSense jako zadania w tle w odpowiedzi na pewne zmiany wprowadzone w ustawieniach projektu lub plikach źródłowych.

Jednak w niektórych przypadkach program Visual Studio może nie zaktualizować bazy danych IntelliSense w odpowiednim czasie. Na przykład po uruchomieniu polecenia ściągania git lub wyewidencjonowania git program Visual Studio może potrwać do godziny, aby wykryć zmiany w plikach. Możesz wymusić ponowne skanowanie wszystkich plików w rozwiązaniu, klikając prawym przyciskiem myszy węzeł projektu w Eksplorator rozwiązań i wybierając polecenie Przeskanuj rozwiązanie.

Rozwiązywanie problemów z błędami kompilacji funkcji IntelliSense

Kompilacja intelliSense nie generuje plików binarnych, ale nadal może zakończyć się niepowodzeniem. Jedną z możliwych przyczyn niepowodzenia jest niestandardowe pliki .props lub targets. W programie Visual Studio 2017 w wersji 15.6 lub nowszej błędy kompilacji tylko z funkcją IntelliSense są rejestrowane w oknie Dane wyjściowe. Aby je wyświetlić, ustaw opcję Pokaż dane wyjściowe z na Rozwiązanie:

Output window for solution errors

Komunikat o błędzie może spowodować włączenie śledzenia czasu projektowania:

error: Designtime build failed for project 'E:\src\MyProject\MyProject.vcxproj',
configuration 'Debug|x64'. IntelliSense might be unavailable.
Set environment variable TRACEDESIGNTIME=true and restart
Visual Studio to investigate.

Jeśli ustawisz zmienną środowiskową TRACEDESIGNTIME na wartość true i uruchom ponownie program Visual Studio, w katalogu %TEMP% zostanie wyświetlony plik dziennika, który może pomóc zdiagnozować błąd kompilacji.

Aby dowiedzieć się więcej na temat zmiennej środowiskowej TRACEDESIGNTIME, zobacz Roslyn i Common Project System. Informacje w tych artykułach są istotne dla projektów języka C++.