У меня возникли проблемы с тем, чтобы Intellisense повиновался языковой версии, установленной для проекта.Я использую Visual Studio Community 2017 15.9.6, и я установил свой проект на /std:c++17
.Intellisense сообщает об ошибках , но у компилятора проблем нет.Это фрагмент кода, который вызывает проблемы, связанные с директивой #include
.
// Intellisense seems to disagree with the compiler on the validity of inline variables in C++17
#ifdef __cpp_inline_variables
#undef __cpp_inline_variables
#include <cnl/all.h>
#define __cpp_inline_variables 201606
#else
#include <cnl/all.h>
#endif
Ошибка 1
Сначала, независимо от вышеуказанного #define
, я получаю ошибку для файлавключается косвенно из cnl/all.h
:
Error (active) E1823 a trailing return type requires the 'auto' type specifier
Когда я открываю причину ошибки и попадаю в файл, для этого файла нет ошибки intellisense, и исходная ошибка для моего проекта исчезает, пока я не выполнюнекоторые снова изменились.Это та часть, на которую он жалуется:
#if defined(_MSC_VER)
constexpr operator auto() const -> value_type
{
return value;
}
#else
constexpr operator value_type() const
{
return value;
}
#endif
Макрос _MSC_VER
установлен на 1916
как до, так и после включения.
Ошибка 2
Вторая ошибка от Intellisense (компилятор игнорирует мою инструкцию undefine __*
определяет и все еще компилирует), которую я получаю, если удаляю материал с __cpp_inline_variables
выше, снова для файла, включенного в cnl, это:
Error (active) E0325 inline specifier allowed on function declarations only
Но когда я захожу в настоящий файл, ошибка Intellisense меняется на:
Error (active) E1449 explicit specialization of variable "cnl::invsqrtpi [with T=long double]" must precede its first use
Код (я представляю только фрагмент, выглядит так):
#if defined(__cpp_inline_variables)
/// specialization of \ref cnl::invsqrtpi for `long double`
template<> inline constexpr long double invsqrtpi<long double>{
0.564189583547756286948079451560772585844050629329L};
/// ..... similar stuff
#endif
Но может показаться, что сама цель макроса набора компиляторов состоит в том, чтобы точно гарантировать, что этот код определен только в том случае, если компилятор поддерживает его - что он делает, - так почему же Intellisense безумен?С моим #undef
выше, который компилятор игнорирует, Intellisense перестает жаловаться на вторую ошибку, поскольку он, очевидно, принимает #undef
, но я все еще получаю первый тип ошибки.
Как заставить Intellisense уважатьязыковые настройки проекта, например /std:c++17
?Если это невозможно, как я могу временно отключить его, например, что-то вроде #pragma intellisense disable error 0325
.