标签:其他 develop end fine tps msvc lse span 问题
在MSVC中,编译器通过_MSVC_LANG宏来判断C++的版本号,其他编译器通过__cplusplus 宏来判断。
所以可以通过使用:cout<<_MSVC_LANG<<endl; 来获取当前Visual Studio使用的版本号,be careful, _MSVC_LANG 是不等于 __cplusplus的,所以有些时候引入某些头文件,再使用时,会报错,究其原因,还是C++版本的问题。
如引入:
#include <filesystem>
namespace fs = std::filesystem;
会报错: namespace 没有成员 "filesystem"
进入但 fielsystem 是有 filesystem namespace 的定义的,但是是有条件的,即 在# define _HAS_CXX17 1 时,该命名空间才存在,所以进一步搜索看_HAS_CXX17在何时才定义为 1, 一般不建议自己在程序中定义 # define _HAS_CXX17 1,因为_HAS_CXX17 为内部变量,即便你自己定义了,会造成宏重定义的问题。找到 _HAS_CXX17定义的头文件,发现:
#if _STL_LANG > 201703L #define _HAS_CXX17 1 #define _HAS_CXX20 1 #elif _STL_LANG > 201402L #define _HAS_CXX17 1 #define _HAS_CXX20 0 #else // _STL_LANG <= 201402L #define _HAS_CXX17 0 #define _HAS_CXX20 0
发现其定义为 0 或 1 取决于 _STL_LANG 变量的选择,再搜寻 _STL_LANG 的定义:
#if defined(_MSVC_LANG) #define _STL_LANG _MSVC_LANG #else // ^^^ use _MSVC_LANG / use __cplusplus vvv #define _STL_LANG __cplusplus #endif // ^^^ use __cplusplus ^^^
发现其又与变量 _MSVC_LANG 有关,而_MSVC_LANG为内部变量,无相关定义,网上查阅相关资料显示,其与Visual Studio中设置的参数有关:
右击项目->属性->C/C++->语言->C++ 语言标准 。 当设置为默认值(应该即为 IOS2014 C++ 14 标准)时,_MSVC_LANG值为 201402L,当其值设置为:IOS2014 C++ 14 标准时,_MSVC_LANG值为 201703L。修改配置后,程序恢复正常。
标签:其他 develop end fine tps msvc lse span 问题
原文地址:https://www.cnblogs.com/justaname/p/12006155.html