我在让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
首先,不管上面的#define
是什么,我都从cnl/all.h
间接包含了一个文件错误:
Error (active) E1823 a trailing return type requires the 'auto' type specifier
当我打开错误原因并找到文件时,该文件没有智能感知错误,并且项目的原始错误消失了,直到我再次进行更改。这是它抱怨的部分:
#if defined(_MSC_VER)
constexpr operator auto() const -> value_type
{
return value;
}
#else
constexpr operator value_type() const
{
return value;
}
#endif
在包含之前和之后,宏_MSC_VER
都设置为1916
。
来自Intellisense的第二个错误(编译器会忽略我取消定义__*
定义的指令,并且仍在编译)如果我删除了上面__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
。