Слишком много ошибок для правильной работы движка IntelliSense

Пожалуйста, оставьте тег window-installer внутри - это Q/A не для экспертов C++, но для таких людей, как я, которые используют C++, когда это необходимо. Они могут столкнуться с этой потенциальной тратой времени, и им нужно быстрое решение, чтобы получить msi.h или другое включает в себя оперативно. Шаблоны VS2017, должно быть, немного изменились - я не видел эту проблему раньше.


Visual Studio 2017 Community Edition со всеми доступными компонентами C++ (возможно, этой проблемы не существует в профессиональной редакции?).

  1. File => New => Project... => Visual C++\Windows Desktop\Windows Console Application => OK,
  2. Выполните быструю тестовую сборку, чтобы убедиться в отсутствии ошибок. Right click solution => Build, Как указано, ошибок не должно быть.
  3. Теперь добавьте это включение для msi.h прямо ниже #include stdafx.h прямо над main() Функция в файле CPP консольного приложения:
#include <msi.h>
// And just to make things link:
#pragma comment(lib, "msi.lib")
  1. Красный шеврон с ошибкой должен отображаться в верхнем левом углу в начале комментария к первой строке, в котором говорится о наведении: "Слишком много ошибок для правильной работы механизма IntelliSense, некоторые из которых могут не отображаться в редакторе. PCH предупреждение: произошла неизвестная ошибка. Файл IntelliSense PCH не был создан."

  2. Выполнение сборки сейчас должно выявить многочисленные ошибки. В моем случае от wincrypt.h - и это заставило меня задуматься WIN32_LEAN_AND_MEAN - см. ответ ниже. Я думал, что такие основы уже будут включены.

Я продолжаю видеть эту проблему во всем новом C++ Windows Console Application projects, но когда я пытаюсь в более старом проекте, созданном с Visual Studio 2013 правильно компилируется с msi.h включены вместе со ссылкой на прагму.

Судя по сообщению об ошибке, должно быть что-то не так с предварительно скомпилированным заголовком (PCH). Это то, что меня оттолкнуло.

1 ответ

Решение

ОБНОВЛЕНИЕ: Другие спрашивали об одном и том же сообщении об ошибке для других включаемых файлов (не связанных с MSI). Я думаю, что это общая проблема, которая возникает время от времени - вероятно, с классами, которые мало используются (или включают в себя Windows.h - возможно)?

Как общее предположение, это может быть скрытая проблема с зависимостями (отсутствующее включение) или неправильный порядок включаемых файлов (необходимо изменить порядок включений по какой-либо технической причине, которая не сразу очевидна) или неверный или отсутствует определение (как видно в ответе под строкой ниже). Мой взгляд на это: зайдите на github.com и найдите похожий пример кода.

Эти проблемы могут быть довольно неуклюжими для тех, кто время от времени нуждается в C++, и в остальном "хорошо известны" профессионалам C++ (которые исправляют это за секунды как вторая натура). Плюсы C++: пожалуйста, имейте в виду, что подобные проблемы могут убить целый день производительности для тех из нас, кто вынужден связываться с C++, когда нам нужно - и у нас нет профессионалов C++, чтобы задавать вопросы - ужасная ситуация, которая!:-) - Настоящим я заявляю: " Будь добр к своему гуру C++ - если он у тебя есть - день! ").


В stdafx.h попробуйте добавить это после #pragma once и прежде чем включает в себя:

#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>

Теперь попробуйте перестроить ваше решение и посмотреть, исчезла ли проблема.

Несмотря на простоту, странность сообщения об ошибке (см. Вопрос выше) может сбить людей с толку, пытаясь понять, что не так. Кроме того, это поведение кажется новым в VS2017 - смена шаблона.

Похоже, в том числе <atlstr.h> также будет работать, так что, вероятно, делает мою проблему более неясной. Хотя я мог бы поклясться, что попробовал это сделать - может быть, после того, как я внес изменения в настройки проекта, которые все равно не сработали (именно то, что я надеюсь помочь другим избежать).

Если в файле могут присутствовать только эти основные включения, но они закомментированы, чтобы их можно было быстро включить последовательно для тестирования - без суеты.

Другие вопросы по тегам