# operator and directive | Stringify operator and null directive |
# // Null directive # identifier |
A preprocessor directive with no directive name is called a null directive. It has no effect.
The # operator can also be used as a unary operator, sometimes called the stringify operator because it turns its operand into a string. It can be used only in the macro replacement text of a #define directive. It must be followed by a parameter name for the macro being defined. The # operator and the parameter name are replaced by a string literal whose contents are the text of the macro argument that corresponds to the macro parameter. The macro argument is not expanded before being converted to a string. Whitespace in the argument is condensed to a single space character between tokens; leading and trailing whitespace is removed.
The evaluation order of # and ## operators is undefined. If the order is important, you can control the order by using multiple macros.
The following example prints the text [now is the time]:
#define now then #define is was #define print(stuff) std::cout << "[" #stuff "]\n" print( now is the time );
## operator, #define directive