This is one of three preprocessor operators. The other two operators are the token pasting operator (##
) and the define
operator.
The behaviour is the same for both C and C++ compilers.
Purpose
The stringizing operator is used to convert parameters passed to a macro into strings.
Format
# token_to_turn_into_a_string
Use
The stringizing (#
) operator may only be used with #define
preprocessor directives taking a parameter.
The parameter token immediately to the right of the stringizing operator (ignoring any white space) is transformed by the preprocessor into a string.
For example:
#define make_string(x) #x
will convert whatever is passed as parameter x
into a string.
Leading and trailing white space are deleted.
Any white space between the parameter’s tokens are collapsed into a single white space character between tokens.
Any conversions necessary to make character literals in the parameter’s tokens valid in a string are automatically made. This means that characters like: \
and "
are automatically converted to \\
and \"
respectively.
If the token is a macro, the macro is not expanded – the macro name is converted into a string. As a consequence, some characters cannot be stringized – notably, the comma (,
) because it is used to delimit parameters and the right parenthesis ()
) because it marks the end of the parameter list.
Examples
Given the following macros:
#define make_string(x) #x
#define COMMA ,
the following uses:
make_string(twas brillig); make_string( twas brillig ); make_string("twas" "brillig"); make_string(twas COMMA brillig);
get expanded into:
// no surprise here "twas brillig" // leading and trailing spaces were trimmed, // space between words was compressed to a single space character "twas brillig" // the quotes were automatically converted "\"twas\" \"brillig\"" // the macro COMMA was not expanded "twas COMMA brillig"
In C99 and the upcoming C++0x languages, you can use a variadic macro to pass commas to the stringizing operator.
#define make_string(...) # __VA_ARGS__
Since __VA_ARGS__ does not process the comma separator, you can pass it to the stringizing operator. However, you still cannot pass the right parenthesis.
Stringizing a Single Character
Sometimes you want to create a character literal. Unfortunately, the language does not specify a charizing operator (although, the Microsoft compiler does provide the non-standard operator #@
for charizing a single character).
However, you can simulate a charizing operator as follows:
#define CHARIZE(x) #x[0]
What this does is stringize whatever is passed as parameter x
and then addresses the first character – effectively acting as though the parameter had been charized. This works in most places a character literal is expected, but not all.