C++ 宏
__cplusplus
包含并扩展为什么?
宏
__cplusplus
是否始终(即使在最古老的C++实现中)包含并扩展为数字值?
使用安全吗
#if __cplusplus
或者我们应该使用 #ifdef __cplusplus
来代替?
来自评论和接受的答案:
__cplusplus
扩展为代表标准版本的数字,90 年代初的预标准 C++ 除外(仅扩展为 1
)。
是的,即使在最古老的 C++ 实现中(扩展为数值)。
不可以,当标头与 C 语言共享时应使用
#ifdef
(因为某些 C 编译器在 #if
检查未定义的宏时会发出警告)。
是的,它总是扩展为数值,其含义是正在使用的 C++ 标准的版本。根据 cppreference page,
__cplusplus
宏应扩展为:
- 199711L(直到 C++11),
- 201103L(C++11),
- 201402L(C++14),
- 201703L(C++17),
- 202002L(C++20)
- 202302L(C++23)
#if
和#ifdef
指令之间的区别在于#ifdef
应该用于检查是否已定义给定的宏以允许编译一段代码。
另一方面,
#if
(#else
, #elif
) 指令可用于检查是否满足指定条件(就像典型的 if 条件一样)。
不幸的是,无论指定的 C++ 标准如何,
__cplusplus
宏在 MS Visual Studio 2022 中具有值 199711
。请改用 _MSVC_LANG
。请参阅VS评论。
这似乎有效:
#if defined(_MSVC_LANG) // MS compiler has different __cplusplus value.
# if _MSVC_LANG < 201703
# error Please compile for C++17 or higher
# endif
#else // All other compilers.
# if __cplusplus < 201703
# error Please compile for C++17 or higher
# endif
#endif