如何检测在 Project->General Properties->C++ Language Standard 中选择了哪种 (C++) 语言标准
How to detect which (C++) language standard was selected in the Project->General Properties->C++ Language Standard
我正在使用 Visual Studio 2019 进行开发,希望能够根据所选的语言标准有条件地编译我的 C++ 程序(C++20、C++17 等) 来自项目属性 -> 常规属性 -> C++ 语言标准。
例如,当我将它设置为 C++20 时定义的内容,以便我可以将其用作:
#ifdef WHAT_DO_I_PUT_HERE_FOR_C++_20
#else
#ifdef WHAT_DO_I_PUT_HERE_FOR_C++_17
...
这应该有效:
#if (__cplusplus >= 202002L)
// C++20 (or later) code
#elif (__cplusplus == 201703L)
// C++17 code
#else
// C++14 or older code
#endif
您可以使用 MSVC predefined macro _MSVC_LANG
:
#ifndef VT_CPP_VERSION
# if defined (_MSVC_LANG)
# define VT_CPP_VERSION _MSVC_LANG
# else
# define VT_CPP_VERSION __cplusplus
# endif
#endif
#if defined (VT_CPP_VERSION)
# if (VT_CPP_VERSION >= 202002L)
// 20 or above
# elif (VT_CPP_VERSION >= 201703L)
// 17
# elif (VT_CPP_VERSION >= 201402L)
// 14
# elif (VT_CPP_VERSION >= 201103L)
// 11
# else
// cry.
# endif
#endif
如果你需要在代码编译完成后获取这个值(例如:一个共享库),那么你可以使用一个函数。
[[maybe_unused]] long version_used() noexcept {
#if defined (_MSVC_LANG)
return _MSVC_LANG;
#else
return __cplusplus;
#endif
}
我正在使用 Visual Studio 2019 进行开发,希望能够根据所选的语言标准有条件地编译我的 C++ 程序(C++20、C++17 等) 来自项目属性 -> 常规属性 -> C++ 语言标准。 例如,当我将它设置为 C++20 时定义的内容,以便我可以将其用作:
#ifdef WHAT_DO_I_PUT_HERE_FOR_C++_20
#else
#ifdef WHAT_DO_I_PUT_HERE_FOR_C++_17
...
这应该有效:
#if (__cplusplus >= 202002L)
// C++20 (or later) code
#elif (__cplusplus == 201703L)
// C++17 code
#else
// C++14 or older code
#endif
您可以使用 MSVC predefined macro _MSVC_LANG
:
#ifndef VT_CPP_VERSION
# if defined (_MSVC_LANG)
# define VT_CPP_VERSION _MSVC_LANG
# else
# define VT_CPP_VERSION __cplusplus
# endif
#endif
#if defined (VT_CPP_VERSION)
# if (VT_CPP_VERSION >= 202002L)
// 20 or above
# elif (VT_CPP_VERSION >= 201703L)
// 17
# elif (VT_CPP_VERSION >= 201402L)
// 14
# elif (VT_CPP_VERSION >= 201103L)
// 11
# else
// cry.
# endif
#endif
如果你需要在代码编译完成后获取这个值(例如:一个共享库),那么你可以使用一个函数。
[[maybe_unused]] long version_used() noexcept {
#if defined (_MSVC_LANG)
return _MSVC_LANG;
#else
return __cplusplus;
#endif
}