Заставьте Intellisense подчиняться стандартной языковой версии для C ++ - PullRequest
0 голосов
/ 08 февраля 2019

У меня возникли проблемы с тем, чтобы 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.

...