判断 C++ Builder 版本
可以通过宏定义 __BORLANDC__ 的值判断 C++ Builder 版本,如果没有 __BORLANDC__ 宏定义,说明不是 C++ Builder 编译器。
• C++ Builder 历经了很多版本,无论怎样更改,最原始的 __BORLANDC__ 保留了下来,这是应用最多的判断版本的方法。
• 对于目前版本的 C++ Builder 来说 __BORLANDC__, __BCPLUSPLUS__, __TURBOC__, __TCPLUSPLUS__ 和 __CODEGEARC__ 的值是相等的,
· __BORLANDC__ 表示 Borland C 和 Borland C++
· __BCPLUSPLUS__ 表示 Borland C++
· __TURBOC__ 表示 Turbo C 和 Turbo C++
· __TCPLUSPLUS__ 表示 Turbo C++
· __CODEGEARC__ 是 CodeGear 收购 Borland 时加上的,而到了 Embarcadero 手里依然保留着,并没有把这个宏定义去掉。
• 即使新版的 C++ Builder 使用了 clang 编译器,这些值也是代表着 C++ Builder 的版本,并不代表用了 Borland 编译器。
__BORLANDC__ 的值 |
对应的 C++ Builder 或 Borland C++ 的版本 |
0x0200 |
Borland C++ 2.0 |
0x0400 |
Borland C++ 3.0 |
0x0410 |
Borland C++ 3.1 |
0x0452 |
Borland C++ 4.0 |
0x0500 |
Borland C++ 5.0 |
0x0520 |
C++ Builder 1.0 / Borland C++ 5.02 |
0x0530 |
C++ Builder 3.0 |
0x0540 |
C++ Builder 4.0 |
0x0550 |
C++ Builder 5.0 |
0x0551 |
Borland C++ 5.51 |
0x0560 |
C++ Builder 6.0 |
0x0570 |
Developer Studio 2006. |
0x0590 |
C++Builder 2007. |
0x0591 |
update 1 to C++Builder 2007. |
0x0592 |
RAD Studio 2007. |
0x0593 |
the December update to RAD Studio 2007. |
0x0610 |
C++Builder 2009 and for C++Builder 2009 Update 1. |
0x0620 |
C++Builder 2010 and for C++Builder 2010 Update 1. |
0x0621 |
C++Builder 2010 Update 2. |
0x0630 |
C++Builder XE. |
0x0631 |
C++Builder XE Update 1. |
0x0640 |
C++Builder XE2. |
0x0650 |
C++Builder XE3 and C++Builder XE3 Update 1. |
0x0651 |
January 2013 update (BCC32 and BCCOSX); BCC64 remained at 0x0650. |
0x0660 |
C++Builder XE4 (BCC32 and BCCOSX); BCC64 remained at 0x0650. |
0x0670 |
C++Builder XE5 (BCC32, BCC64, BCCOSX, and BCCIOSARM). |
0x0680 |
C++Builder XE6 (BCC32, BCC64, BCCOSX, BCCIOSARM, and BCCAARM). |
0x0690 |
C++Builder XE7 (BCC32, BCC64, BCCOSX, BCCIOSARM, and BCCAARM). |
0x0700 |
C++Builder XE8 (BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM). |
0x0710 |
C++Builder 10.0 Seattle (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM). |
0x0711 |
C++Builder 10.0 Seattle Subscription Update 1 (BCC32); other compilers remained at 0x0710. |
0x0720 |
C++Builder 10.1 Berlin (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM). |
0x0730 |
C++Builder 10.2 Tokyo (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM). |
0x0730 0x0740 |
C++Builder 10.3 RIO (BCC64: 0x0730)
C++Builder 10.3 RIO (BCC32C & BCC32: 0x0740), other compilers: not test. |
应用示例:
#if defined(__BORLANDC__)
// 是 C++ Builder
#else
// 不是 C++ Builder
#endif |
UnicodeString sHomePath;
#if(__BORLANDC__>=0x0720) // C++Builder 10.1 Berlin or Later
sHomePath = TPath::GetHomePath();
#else // Earlier Versions
TCHAR szhp[MAX_PATH];
if(SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, szhp)==S_OK)
sHomePath = szhp;
#endif |
Copyright © Victor Chen, http://www.cppfans.com/
判断 C++ Builder 使用的是 clang 编译器或是 Borland 编译器
可以通过宏定义 __clang__ 判断是否 clang 编译器,如果有这个宏定义,就是 clang 编译器,否则就是 Borland 编译器
• 由于 C++ Builder 的 __BORLANDC__ 始终存在,所以只能用 __clang__ 来区分编译器类型。
• __clang__ 是一个固定的值 (1),所以不能通过 __clang__ 来判断编译器的版本,只用来判断编译器的类型。
• 可以通过 __clang_version__, __clang_major__ 和 __clang_minor__ 来判断 clang 编译器的版本。
• clang 编译器不建议使用版本号来判断编译器是否有哪个功能,而是用每个具体功能的宏定义来判断。
#if defined(__BORLANDC__)
#if defined(__clang__)
// C++ Builder: clang 编译器
#else
// C++ Builder: Borland 编译器
#endif
#else
// 不是 C++ Builder
#endif |
判断 C++ 或是 C 编译器
可以通过 __cplusplus 宏定义判断是否 C++ 编译器
例如:强制一段代码采用 C 语言编译器,而不是 C++ 编译器:
#ifdef __cplusplus // 如果是 C++ 编译器
extern "C" { // 强制使用 C 语言编译器
#endif
// 这里的代码强制使用 C 语言编译器
#ifdef __cplusplus // 如果是 C++ 编译器
} // extern "C" // 结束强制 C 语言编译器
#endif |
判断 32 位 / 64 位编译器
由于 Borland 编译器只有 32 位版本的,clang 编译器有 32 位或 64 位版本的,
所以可以通过 clang 的宏定义 __POINTER_WIDTH__ 判断,__POINTER_WIDTH__ 是指针位数,等于 32 或 64
#if defined(__clang__) && (__POINTER_WIDTH__ == 64)
// 64 位
#endif |
判断 UNICODE / ANSI 编译器
通过宏定义 _UNICODE 判断是否 UNICODE 版本。
#ifdef _UNICODE
// UNICODE
#else
// ANSI
#endif |
判断对应于操作系统 Win32 / Win64 / Android / Apple 与处理器 X86 / X64 / ARM / ARM64 的编译器版本
• 这仍然是判断编译器的版本,而不是判断操作系统的版本
• 以下宏定义可能会同时存在一个或多个,例如 _WIN32, _WIN64 和 _M_X64
• 宏定义 _WIN64 表示为 64 位 Windows 的编译器
• 宏定义 _WIN32 在 32 位和 64 位编译器里面都有定义,所以需要用 _WIN64 来区分 32 位或 64 位
• 宏定义 __ANDROID__ 表示为安卓版本的编译器
• 宏定义 __APPLE__ 表示为苹果版本的编译器
• 宏定义 __arm__ 表示为 ARM 处理器的编译器
• 宏定义 __arm64__ 表示为 ARM64 处理器的编译器
• 宏定义 _M_IX86 表示为 X86 处理器的编译器
• 宏定义 _M_X64 表示为 X64 处理器的编译器
判断是否控制台程序
使用宏定义 __CONSOLE__ 是否存在来判断是否为控制台程序,如果存在 __CONSOLE__ 宏定义,即为控制台程序。
判断 Borland 编译器是否启用了 CodeGuard
使用宏定义 __CODEGUARD__ 是否存在来判断是否启用了 CodeGuard,如果存在 __CODEGUARD__ 宏定义,即为启用了 CodeGuard。
|