主页C++ Builder 资料C++ Builder 参考手册基础知识判断编译器版本
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
 • PME 架构/PME 模型
 • 判断编译器版本
 • 数据对齐方式
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
判断编译器版本
 • 判断 C++ Builder 版本
 • 判断 C++ Builder 使用的是 clang 编译器或是 Borland 编译器
 • 判断 C++ 或是 C 编译器
 • 判断 32 位 / 64 位编译器
 • 判断 UNICODE / ANSI 编译器
 • 判断对应于操作系统 Win32 / Win64 / Android / Apple 与处理器 X86 / X64 / ARM / ARM64 的编译器版本
 • 判断是否控制台程序
 • 判断 Borland 编译器是否启用了 CodeGuard

判断 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

◤上一页:PME 架构/PME 模型下一页:数据对齐方式

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号