Predefined Macros
Go Up to The Preprocessor Index
The C++ compiler predefines certain global identifiers, known as manifest constants. Most global identifiers begin and end with two underscores (__).
For macros whose value takes the form of 0x0nnn, the version number (nnn) is determined by the version number of the associated C++ compiler executable.  Beginning with the XE release, you can verify the version number using the --version option to BCC32.EXE.
| Macro | Value | Description | 
|---|---|---|
| 
 __ANDROID__  | 
 Defined only in compilers that support cross compiling with an Android product as the target platform:  | |
| 
 __APPLE__  | 
 Defined only in compilers that support cross compiling with an Apple product as the target platform:  | |
| 
 __arm__  | 
 Defined only in compilers that support cross compiling for the 32-bit ARM compiler architecture:  | |
| 
 __arm64__  | 
 Defined only in compilers that support cross compiling for the ARM64 compiler architecture:  | |
| 
 __BCOPT__  | 
 1  | 
 Defined only in compilers that support optimization, therefore always defined.  | 
| 
 __BCPLUSPLUS__  | 
 Values are listed in C++ Compiler Versions in this topic.  | 
 Defined if you've selected C++ compilation; will increase in later releases.  | 
| 
 __BOOL__  | 
 1  | 
 Indicates that the bool keyword is accepted.  | 
| 
 __BORLANDC__  | 
 Values are listed in C++ Compiler Versions in this topic.  | 
 Version number.  | 
| 
 __CDECL__  | 
 1  | 
 Defined if Calling Convention is set to cdecl; otherwise undefined.  | 
| 
 _CHAR_UNSIGNED  | 
 1  | 
 Undefined by default. Using the -K switch to make the default character unsigned causes this macro to be defined. Ultimately, the -K option controls how a char is extended when converted to an int. By default, the compiler sign-extends, but if you enable _CHAR_UNSIGNED_, then the compiler zero-extends characters when converting to int.  | 
| 
 __clang__   | 
 1   | 
 Defined if a Clang-enhanced C++ compiler is in use. See Clang Builtin Macros.  | 
| 
 __CODEGEARC__  | 
 Values are listed in C++ Compiler Versions and in this topic.  | 
 Version number.  | 
| 
 __CODEGEARC_VERSION__  | 
  | 
 This internal macro expands to an integer that encodes the major version of the compiler, minor version, and an internal number. See Example of __CODEGEARC_VERSION__ Macro.  | 
| 
 __CODEGUARD__  | 
 Defined whenever one of the CodeGuard compiler options is used; otherwise it is undefined.  | |
| 
 __CONSOLE__  | 
 1  | 
 When defined, the macro indicates that the program is a console application.  | 
| 
 _CPPUNWIND  | 
 1  | 
 Enable stack unwinding. This is true by default; use -xd-!ALink(OSCGExceptions1) to disable.  | 
| 
 __cplusplus  | 
 1  | 
 Defined if in C++ mode; otherwise, undefined.  | 
| 
 __DATE__  | 
 String literal  | 
 Date when processing began on the current file.  | 
| 
 __DLL__  | 
 1  | 
 Defined whenever the -WD compiler option is used; otherwise it is undefined.  | 
| 
 __FILE__  | 
 String literal  | 
 Name of the current file being processed.  | 
| 
 __FLAT__  | 
 1  | 
 Defined when compiling in 32-bit flat memory model.  | 
| 
 __FUNC__ or __FUNCTION__  | 
 String literal  | 
 Name of the current function being processed. More details.  | 
| 
 __LINE__  | 
 Decimal constant  | 
 Number of the current source file line being processed.  | 
| 
 __MACH__  | 
 Defined only in compilers that support cross compiling with a target of MAC OSX.  | |
| 
 _M_IX86  | 
 0x12c  | 
 Always defined. The default value is 300. You can change the value to 400 or 500 by using the /4 or /5 compiler options.  | 
| 
 __MT__  | 
 1  | 
 Defined only if the -tWM option is used. It specifies that the multithread library is to be linked.  | 
| 
 __PASCAL__  | 
 1  | 
 Defined if Calling Convention is set to Pascal; otherwise undefined.  | 
| 
 _PUSHPOP_SUPPORTED  | 
 1  | 
 Always defined; allows Microsoft standard headers to use push and pop to verify whether a feature is supported.  | 
| 
 _STDCALL_SUPPORTED  | 
 1  | 
 Always defined; defines the Microsoft stdcall calling convention.  | 
| 
 __STDC__  | 
 1  | 
 Defined if you compile with the -A compiler option; otherwise, it is undefined.  | 
| 
 __TCPLUSPLUS__  | 
 Values are listed in C++ Compiler Versions in this topic.  | 
 Version number.  | 
| 
 __TEMPLATES__  | 
 1  | 
 Defined as 1 for C++ files (meaning that templates are supported); otherwise, it is undefined.  | 
| 
 __TIME__  | 
 String literal  | 
 Time when processing began on the current file.  | 
| 
 __TLS__  | 
 1  | 
 Thread Local Storage. Always true.  | 
| 
 __TURBOC__  | 
 Values are listed in C++ Compiler Versions and in this topic.  | 
 Will increase in later releases.  | 
| 
 _UNICODE and UNICODE  | 
 Defined for C++ programs that use the VCL.  | |
| 
 _WCHAR_T  | 
 Defined only for C++ programs to indicate that wchar_t is an intrinsically defined data type.  | |
| 
 _WCHAR_T_DEFINED  | 
 Defined only for C++ programs to indicate that wchar_t is an intrinsically defined data type.  | |
| 
 _Windows  | 
 1  | 
 Defined when compiling on the Windows platform.  | 
| 
 __WIN32__  | 
 1  | 
 Defined for console and GUI applications on the 32-bit Windows platform. The classic compiler defines this macro as a built-in. The Clang-based compiler requires _defs.h be included, but this header file is normally included by default in a standard application.  | 
| 
 _WIN64  | 
 1  | 
 Defined for console and GUI applications on the 64-bit Windows platform.  | 
- The predefined macros __DATE__, __FILE__ , __FUNC__, __LINE__, __STDC__, and __TIME__ cannot be redefined or undefined.
 - In order to check the entire list of predefined macros supported by Clang-enhanced C++ compilers, see predefined macros.
 
C++ Compiler Versions in Predefined Macros
The macros defined for the C++ compiler (such as __CODEGEARC__) have the following version numbers:
- 0x0570 for Developer Studio 2006.
 - 0x0590 for C++Builder 2007.
 - 0x0591 for update 1 to C++Builder 2007.
 - 0x0592 for RAD Studio 2007.
 - 0x0593 for the December update to RAD Studio 2007.
 - 0x0610 for C++Builder 2009 and for C++Builder 2009 Update 1.
 - 0x0620 for C++Builder 2010 and for C++Builder 2010 Update 1.
 - 0x0621 for C++Builder 2010 Update 2.
 - 0x0630 for C++Builder XE.
 - 0x0631 for C++Builder XE Update 1.
 - 0x0640 for C++Builder XE2.
 - 0x0650 for C++Builder XE3 and C++Builder XE3 Update 1.
 - 0x0651 for January 2013 update (BCC32); BCC64 remained at 0x0650.
 - 0x0660 for C++Builder XE4 (BCC32 and BCCOSX); BCC64 remained at 0x0650.
 - 0x0670 for C++Builder XE5 (BCC32, BCC64, BCCOSX, and BCCIOSARM).
 - 0x0680 for C++Builder XE6 (BCC32, BCC64, BCCOSX, BCCIOSARM, and BCCAARM).
 - 0x0690 for C++Builder XE7 (BCC32, BCC64, BCCOSX, BCCIOSARM, and BCCAARM).
 - 0x0700 for C++Builder XE8 (BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM).
 - 0x0710 for C++Builder Seattle (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM).
 - 0x0711 for C++Builder Seattle Subscription Update 1 (BCC32); other compilers remained at 0x0710.
 - 0x0720 for C++Builder Berlin (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM).
 - 0x0730 for C++Builder Tokyo (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, and BCCAARM).
 - 0x0740 for C++Builder Rio (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, BCCAARM, and BCC32X).
 - 0x0750 for C++Builder Sydney (BCC32C, BCC32, BCC64, BCCOSX, BCCIOSARM, BCCIOSARM64, BCCAARM, and BCC32X).
 
See also Compiler Versions.
Macros Defined Elsewhere
The following macros are defined for backwards-compatibility when you #include System.hpp:
| Macro | Value | Description | 
|---|---|---|
| 
 ANSISTRING_AS_TEMPLATE  | 
 AnsiString type is defined as a template class, AnsiString<T>.  | |
| 
 _STRINGCHECKS_OFF  | 
 In past releases, C++ programs expected the Delphi compiler to not set the STRINGCHECKS directive. The Delphi compiler no longer supports the STRINGCHECKS directive, so the related _STRINGCHECKS_OFF C++ macro is unnecessary and is no longer set. Therefore if you are migrating pre-2009 code to the current version, you need to update the event-handler signature (because a pre-2009 event handler expects AnsiString, while the run time now sends UnicodeString). See Unicode in RAD Studio.  |