Predefined macros are those that the compiler defines (in contrast to those user defines in the source file). Those macros must not be re-defined or undefined by user.
The following macros are predefined by the C++ standard:
__LINE__
contains the line number of the line this macro is used on, and can be changed by the #line
directive.__FILE__
contains the filename of the file this macro is used in, and can be changed by the #line
directive.__DATE__
contains date (in "Mmm dd yyyy"
format) of the file compilation, where Mmm is formatted as if obtained by a call to std::asctime()
.__TIME__
contains time (in "hh:mm:ss"
format) of the file compilation.__cplusplus
is defined by (conformant) C++ compilers while compiling C++ files. Its value is the standard version the compiler is fully conformant with, i.e. 199711L
for C++98 and C++03, 201103L
for C++11 and 201402L
for C++14 standard.__STDC_HOSTED__
is defined to 1
if the implementation is hosted, or 0
if it is freestanding.__STDCPP_DEFAULT_NEW_ALIGNMENT__
contains a size_t
literal, which is the alignment used for a call to alignment-unaware operator new
.Additionally, the following macros are allowed to be predefined by implementations, and may or may not be present:
__STDC__
has implementation-dependent meaning, and is usually defined only when compiling a file as C, to signify full C standard compliance. (Or never, if the compiler decides not to support this macro.)__STDC_VERSION__
has implementation-dependent meaning, and its value is usually the C version, similarly to how __cplusplus
is the C++ version. (Or is not even defined, if the compiler decides not to support this macro.)__STDC_MB_MIGHT_NEQ_WC__
is defined to 1
, if values of the narrow encoding of the basic character set might not be equal to the values of their wide counterparts (e.g. if (uintmax_t)'x' != (uintmax_t)L'x'
)__STDC_ISO_10646__
is defined if wchar_t
is encoded as Unicode, and expands to an integer constant in the form yyyymmL
, indicating the latest Unicode revision supported.__STDCPP_STRICT_POINTER_SAFETY__
is defined to 1
, if the implementation has strict pointer safety (otherwise it has relaxed pointer safety)__STDCPP_THREADS__
is defined to 1
, if the program can have more than one thread of execution (applicable to freestanding implementation — hosted implementations can always have more than one thread)It is also worth mentioning __func__
, which is not an macro, but a predefined function-local variable. It contains the name of the function it is used in, as a static character array in an implementation-defined format.
On top of those standard predefined macros, compilers can have their own set of predefined macros. One must refer to the compiler documentation to learn those. E.g.:
Some of the macros are just to query support of some feature:
#ifdef __cplusplus // if compiled by C++ compiler
extern "C"{ // C code has to be decorated
// C library header declarations here
}
#endif
Others are very useful for debugging:
bool success = doSomething( /*some arguments*/ );
if( !success ){
std::cerr << "ERROR: doSomething() failed on line " << __LINE__ - 2
<< " in function " << __func__ << "()"
<< " in file " << __FILE__
<< std::endl;
}
And others for trivial version control:
int main( int argc, char *argv[] ){
if( argc == 2 && std::string( argv[1] ) == "-v" ){
std::cout << "Hello World program\n"
<< "v 1.1\n" // I have to remember to update this manually
<< "compiled: " << __DATE__ << ' ' << __TIME__ // this updates automagically
<< std::endl;
}
else{
std::cout << "Hello World!\n";
}
}