Preprocessor directives - C++ Tutorials
Preprocessor directives - C++ Tutorials
Search: Go
Not logged in
C++
Information
Tutorials
Reference
Articles
Forum
Defined macros are not affected by block structure. A macro lasts until it is undefined with the #undef preprocessor
directive:
1 int table1[100];
2 int table2[200];
Function macro definitions accept two special operators (# and ##) in the replacement sequence:
The operator #, followed by a parameter name, is replaced by a string literal that contains the argument passed (as if
enclosed between double quotes):
1 #define str(x) #x
2 cout << str(test);
The operator ## concatenates two arguments leaving no blank spaces between them:
1 #define glue(a,b) a ## b
2 glue(c,out) << "test";
https://www.cplusplus.com/doc/tutorial/preprocessor/ 1/4
6/3/2021 Preprocessor directives - C++ Tutorials
Because preprocessor replacements happen before any C++ syntax check, macro definitions can be a tricky feature.
But, be careful: code that relies heavily on complicated macros become less readable, since the syntax expected is on
many occasions different from the normal expressions programmers expect in C++.
These directives allow to include or discard part of the code of a program if a certain condition is met.
#ifdef allows a section of a program to be compiled only if the macro that is specified as the parameter has been
defined, no matter which its value is. For example:
1 #ifdef TABLE_SIZE
2 int table[TABLE_SIZE];
3 #endif
In this case, the line of code int table[TABLE_SIZE]; is only compiled if TABLE_SIZE was previously defined with
#define, independently of its value. If it was not defined, that line will not be included in the program compilation.
#ifndef serves for the exact opposite: the code between #ifndef and #endif directives is only compiled if the specified
identifier has not been previously defined. For example:
1 #ifndef TABLE_SIZE
2 #define TABLE_SIZE 100
3 #endif
4 int table[TABLE_SIZE];
In this case, if when arriving at this piece of code, the TABLE_SIZE macro has not been defined yet, it would be defined
to a value of 100. If it already existed it would keep its previous value since the #define directive would not be
executed.
The #if, #else and #elif (i.e., "else if") directives serve to specify some condition to be met in order for the portion of
code they surround to be compiled. The condition that follows #if or #elif can only evaluate constant expressions,
including macro expressions. For example:
1 #if TABLE_SIZE>200
2 #undef TABLE_SIZE
3 #define TABLE_SIZE 200
4
5 #elif TABLE_SIZE<50
6 #undef TABLE_SIZE
7 #define TABLE_SIZE 50
8
9 #else
10 #undef TABLE_SIZE
11 #define TABLE_SIZE 100
12 #endif
13
14 int table[TABLE_SIZE];
Notice how the entire structure of #if, #elif and #else chained directives ends with #endif.
The behavior of #ifdef and #ifndef can also be achieved by using the special operators defined and !defined
respectively in any #if or #elif directive:
The #line directive allows us to control both things, the line numbers within the code files as well as the file name that
we want that appears when an error takes place. Its format is:
Where number is the new line number that will be assigned to the next code line. The line numbers of successive lines
will be increased one by one from this point on.
"filename" is an optional parameter that allows to redefine the file name that will be shown. For example:
This code will generate an error that will be shown as error in file "assigning variable", line 20.
https://www.cplusplus.com/doc/tutorial/preprocessor/ 2/4
6/3/2021 Preprocessor directives - C++ Tutorials
1 #ifndef __cplusplus
2 #error A C++ compiler is required!
3 #endif
This example aborts the compilation process if the macro name __cplusplus is not defined (this macro name is defined
by default in all C++ compilers).
1 #include <header>
2 #include "file"
In the first case, a header is specified between angle-brackets <>. This is used to include headers provided by the
implementation, such as the headers that compose the standard library (iostream, string,...). Whether the headers are
actually files or exist in some other form is implementation-defined, but in any case they shall be properly included with
this directive.
The syntax used in the second #include uses quotes, and includes a file. The file is searched for in an implementation-
defined manner, which generally includes the current path. In the case that the file is not found, the compiler interprets
the directive as a header inclusion, just as if the quotes ("") were replaced by angle-brackets (<>).
If the compiler does not support a specific argument for #pragma, it is ignored - no syntax error is generated.
macro value
__LINE__ Integer value representing the current line in the source code file being compiled.
__FILE__ A string literal containing the presumed name of the source file being compiled.
A string literal in the form "Mmm dd yyyy" containing the date in which the compilation process
__DATE__
began.
__TIME__ A string literal in the form "hh:mm:ss" containing the time at which the compilation process began.
An integer value. All C++ compilers have this constant defined to some value. Its value depends on
the version of the standard supported by the compiler:
Non conforming compilers define this constant as some value at most five digits long. Note that many
compilers are not fully conforming and thus will have this constant defined as neither of the values
above.
1 if the implementation is a hosted implementation (with all standard headers available)
__STDC_HOSTED__
0 otherwise.
The following macros are optionally defined, generally depending on whether a feature is available:
macro value
In C: if defined to 1, the implementation conforms to the C standard.
__STDC__
In C++: Implementation defined.
In C:
For example:
Previous: Next:
Exceptions Input/output with files
Index
https://www.cplusplus.com/doc/tutorial/preprocessor/ 3/4
6/3/2021 Preprocessor directives - C++ Tutorials
https://www.cplusplus.com/doc/tutorial/preprocessor/ 4/4