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

