關於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