可以通过宏定义 __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/

可以通过宏定义 __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

可以通过 __cplusplus 宏定义判断是否 C++ 编译器

例如:强制一段代码采用 C 语言编译器,而不是 C++ 编译器:

#ifdef __cplusplus // 如果是 C++ 编译器

extern "C" { // 强制使用 C 语言编译器

#endif

// 这里的代码强制使用 C 语言编译器

#ifdef __cplusplus // 如果是 C++ 编译器

} // extern "C" // 结束强制 C 语言编译器

#endif

由于 Borland 编译器只有 32 位版本的,clang 编译器有 32 位或 64 位版本的,

所以可以通过 clang 的宏定义 __POINTER_WIDTH__ 判断,__POINTER_WIDTH__ 是指针位数,等于 32 或 64

#if defined(__clang__) && (__POINTER_WIDTH__ == 64)

// 64 位

#endif

通过宏定义 _UNICODE 判断是否 UNICODE 版本。

#ifdef _UNICODE

// UNICODE

#else

// ANSI

#endif

• 这仍然是判断编译器的版本,而不是判断操作系统的版本

• 以下宏定义可能会同时存在一个或多个,例如 _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__ 宏定义,即为控制台程序。

使用宏定义 __CODEGUARD__ 是否存在来判断是否启用了 CodeGuard,如果存在 __CODEGUARD__ 宏定义,即为启用了 CodeGuard。

更多推荐

怎么判断C语言编译器版本,判断编译器版本 - C++ Builder 参考手册 - C++ 爱好者