码迷,mamicode.com
首页 > 编程语言 > 详细

关于visual Studio中C++版本版本的问题

时间:2019-12-08 17:58:40      阅读:581      评论:0      收藏:0      [点我收藏+]

标签:其他   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。修改配置后,程序恢复正常。

技术图片

关于visual Studio中C++版本版本的问题

标签:其他   develop   end   fine   tps   msvc   lse   span   问题   

原文地址:https://www.cnblogs.com/justaname/p/12006155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!