Predefined Macros
The compiler recognizes 10 predefined ANSI C macros, and the Microsoft C++ implementation provides several more. These macros take no arguments and cannot be redefined. Their value, except for __LINE__ and __FILE__, must be constant throughout compilation. Some of the predefined macros listed below are defined with multiple values. See the following tables for more information.
ANSI-Compliant Predefined Macros
| Macro | Description |
|---|---|
| __DATE__ | The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H. |
| __FILE__ | The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks.
You can create your own wide string version of __FILE__ as follows:
#include <stdio.h>
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
wchar_t *pwsz = __WFILE__;
int main()
{
}
|
| __LINE__ | The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. |
| __STDC__ | Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined. |
| __TIME__ | The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss. |
| __TIMESTAMP__ | The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31. |
Microsoft-Specific Predefined Macros
| Macro | Description |
|---|---|
| _ATL_VER | Defines the ATL version. |
| _CHAR_UNSIGNED | Default char type is unsigned. Defined when /J is specified. |
| __COUNTER__ | Expands to an integer starting with 0 and incrementing by 1 every time it is used in a compiland. __COUNTER__ remembers its state when using precompiled headers. If the last __COUNTER__ value was 4 after building a precompiled header (PCH), it will start with 5 on each PCH use.
__COUNTER__ lets you generate unique variable names. You can use token pasting with a prefix to make a unique name. For example:
#include <stdio.h>
#define FUNC2(x,y) x##y
#define FUNC1(x,y) FUNC2(x,y)
#define FUNC(x) FUNC1(x,__COUNTER__)
int FUNC(my_unique_prefix);
int FUNC(my_unique_prefix);
int main() {
my_unique_prefix0 = 0;
printf("\n%d",my_unique_prefix0);
my_unique_prefix0++;
printf("\n%d",my_unique_prefix0);
}
|
| __cplusplus | Defined for C++ programs only. |
| _CPPLIB_VER | Defined if you include any of the C++ Standard Library headers; reports which version of the Dinkumware header files are present. |
| _CPPRTTI | Defined for code compiled with /GR (Enable Run-Time Type Information). |
| _CPPUNWIND | Defined for code compiled with /GX (Enable Exception Handling). |
| _DEBUG | Defined when compiling with /LDd, /MDd, /MLd, and /MTd. |
| _DLL | Defined when /MD or /MDd (Multithread DLL) is specified. |
| __FUNCDNAME__ | Valid only within a function and returns the decorated name of the enclosing function (as a string). __FUNCDNAME__ is not expanded if you use the /EP or /P compiler option. |
| __FUNCSIG__ | Valid only within a function and returns the signature of the enclosing function (as a string). __FUNCSIG__ is not expanded if you use the /EP or /P compiler option. |
| __FUNCTION__ | Valid only within a function and returns the undecorated name of the enclosing function (as a string). __FUNCTION__ is not expanded if you use the /EP or /P compiler option. |
| _M_ALPHA | Defined for DEC ALPHA platforms. It is defined as 1 by the ALPHA compiler, and it is not defined if another compiler is used. |
| _M_IX86 | Defined for x86 processors. See Values for _M_IX86 for more details. |
| _M_IA64 | Defined for 64-bit processors. |
| _M_MPPC | Defined for Power Macintosh platforms (no longer supported). |
| _M_MRX000 | Defined for MIPS platforms (no longer supported). |
| _M_PPC | Defined for PowerPC platforms (no longer supported). |
| _MANAGED | Defined to be 1 when /clr is specified. |
| _MFC_VER | Defines the MFC version. For example, 0x0700 represents MFC version 7. |
| _MSC_EXTENSIONS | This macro is defined when compiling with the /Ze compiler option (the default). Its value, when defined, is 1. |
| _MSC_VER | Defines the major and minor versions of the compiler. For example, 1300 for Microsoft Visual C++ .NET. 1300 represents version 13 and no point release. This represents the fact that there have been a total of 13 releases of the compiler.
If you type cl /? at the command line, you will see the full version for the compiler you are using. |
| __MSVC_RUNTIME_CHECKS | Defined when one of the /RTC compiler options is specified. |
| _MT | Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified. |
| _WCHAR_T_DEFINED and _NATIVE_WCHAR_T_DEFINED | Defined when wchar_t is defined. Typically, wchar_t is defined when you use /Zc:wchar_t or when typedef unsigned short wchar_t; is executed in code. |
| _WIN32 | Defined for applications for Win32 and Win64. Always defined. |
| _WIN64 | Defined for applications for Win64. |
| _Wp64 | Defined when specifying /Wp64. |
As shown in following table, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified.
| Option in Development Environment | Command-Line Option | Resulting Value |
|---|---|---|
| Blend | /GB | _M_IX86 = 600 (Default. Future compilers will emit a different value to reflect the dominant processor.) |
| Pentium | /G5 | _M_IX86 = 500 |
| Pentium Pro, Pentium II, and Pentium III | /G6 | _M_IX86 = 600 |
| 80386 | /G3 | _M_IX86 = 300 |
| 80486 | /G4 | _M_IX86 = 400 |