__cplusplus

此宏定义取决于 c++ 编译器。可用于区分 C 或者 C++ 编译。

预定义宏取值

C++ 版本 __cplusplus 取值
C ++ 98/03 199711L
C ++ 11 201103L
C ++ 14 201402L
C ++ 17 201703L
C ++ 20 202002L

gcc: an unspecified value strictly larger than 202002L for the experimental languages enabled by -std=c++23 and -std=gnu++23.

Visual Studio 下的特殊情况

默认情况下,__cplusplus 预处理器宏始终返回值”199711L”。可通过使用 /Zc:__cplusplus 编译器选项进行显式打开(Visual Studio 2017 版本 15.7 开始支持,默认关闭)。启用 /Zc:__cplusplus 选项后,预编译宏的值取决于 /std 版本开关设置。下表列出了该宏的可能值:

/Zc:__cplusplus 开关 /std:c++ 开关 __cplusplus 值
Zc:__cplusplus /std:c++14(默认) 201402L
Zc:__cplusplus /std:c++17 201703L
Zc:__cplusplus /std:c++latest 201704L
Zc:__cplusplus-(已禁用) 任何值 199711L
未指定 任何值 199711L

常用方法

指定 C 语言风格导出符号

1
2
3
4
5
6
7
8
9
#ifdef __cplusplus
extern "C" {
#endif

void test(void*, int, size_t);

#ifdef __cplusplus
}
#endif

兼容 C98 和 C11 的 stl 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#if defined(_WIN32) || defined(_WIN64)
#if _MSC_VER < 1600 // < vs 10
#include <tr1/functional>
#include <tr1/memory>
#else // >= vs10
#include <functional>
#include <memory>
#endif
#endif

#if !(defined(_WIN32) || defined(_WIN64))
#if __cplusplus < 201103L
#include <tr1/functional>
#include <tr1/memory>
#else
#include <functional>
#include <memory>
#endif
#endif

namespace test
{
namespace stdcxx
{
#if __cplusplus < 201103L
using ::std::tr1::function;
using ::std::tr1::bind;
using ::std::tr1::shared_ptr;
using ::std::tr1::dynamic_pointer_cast;

namespace placeholders {
using ::std::tr1::placeholders::_1;
using ::std::tr1::placeholders::_2;
using ::std::tr1::placeholders::_3;
using ::std::tr1::placeholders::_4;
using ::std::tr1::placeholders::_5;
using ::std::tr1::placeholders::_6;
using ::std::tr1::placeholders::_7;
} // test::stdcxx::placeholders
#else // c++ 11
using ::std::function;
using ::std::bind;
using ::std::shared_ptr;
using ::std::dynamic_pointer_cast;

namespace placeholders {
using ::std::placeholders::_1;
using ::std::placeholders::_2;
using ::std::placeholders::_3;
using ::std::placeholders::_4;
using ::std::placeholders::_5;
using ::std::placeholders::_6;
using ::std::placeholders::_7;
} // test::stdcxx::placeholders
#endif
} // namespace stdcxx
} // namespace test
namespace cxx = test::stdcxx;

参考文档:
https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html
https://docs.microsoft.com/zh-cn/cpp/build/reference/zc-cplusplus?view=msvc-160