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


在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。修改配置后,程序恢复正常。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM