Слишком много ошибок для правильной работы движка IntelliSense
Пожалуйста, оставьте тег window-installer внутри - это Q/A не для экспертов C++, но для таких людей, как я, которые используют C++, когда это необходимо. Они могут столкнуться с этой потенциальной тратой времени, и им нужно быстрое решение, чтобы получить
msi.h
или другое включает в себя оперативно. Шаблоны VS2017, должно быть, немного изменились - я не видел эту проблему раньше.
Visual Studio 2017 Community Edition со всеми доступными компонентами C++ (возможно, этой проблемы не существует в профессиональной редакции?).
File => New => Project... => Visual C++\Windows Desktop\Windows Console Application => OK
,- Выполните быструю тестовую сборку, чтобы убедиться в отсутствии ошибок.
Right click solution => Build
, Как указано, ошибок не должно быть. - Теперь добавьте это включение для msi.h прямо ниже
#include stdafx.h
прямо надmain()
Функция в файле CPP консольного приложения:
#include <msi.h>
// And just to make things link:
#pragma comment(lib, "msi.lib")
Красный шеврон с ошибкой должен отображаться в верхнем левом углу в начале комментария к первой строке, в котором говорится о наведении: "Слишком много ошибок для правильной работы механизма IntelliSense, некоторые из которых могут не отображаться в редакторе. PCH предупреждение: произошла неизвестная ошибка. Файл IntelliSense PCH не был создан."
Выполнение сборки сейчас должно выявить многочисленные ошибки. В моем случае от
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>
также будет работать, так что, вероятно, делает мою проблему более неясной. Хотя я мог бы поклясться, что попробовал это сделать - может быть, после того, как я внес изменения в настройки проекта, которые все равно не сработали (именно то, что я надеюсь помочь другим избежать).
Если в файле могут присутствовать только эти основные включения, но они закомментированы, чтобы их можно было быстро включить последовательно для тестирования - без суеты.