The # operator
The
# (single number sign) operator converts
a parameter of a function-like macro into a character string literal.
For example, if macro ABC is defined using the following
directive:
#define ABC(x) #xall subsequent invocations of the macro ABC would be
expanded into a character string literal containing the argument passed
to ABC. For example:
| Invocation | Result of macro expansion |
|---|---|
ABC(1) |
"1" |
ABC(Hello there) |
"Hello there" |
The # operator should not be confused with the
null directive.
Use the
# operator in a function-like macro
definition according to the following rules:
- A parameter following
#operator in a function- like macro is converted into a character string literal containing the argument passed to the macro. - White-space characters that appear before or after the argument passed to the macro are deleted.
- Multiple white-space characters imbedded within the argument passed to the macro are replaced by a single space character.
- If the argument passed to the macro contains a string literal
and if a
\(backslash) character appears within the literal, a second\character is inserted before the original\when the macro is expanded. - If the argument passed to the macro contains a
"(double quotation mark) character, a\character is inserted before the"when the macro is expanded. - The conversion of an argument into a string literal occurs before macro expansion on that argument.
- If more than one
##operator or#operator appears in the replacement list of a macro definition, the order of evaluation of the operators is not defined. - If the result of the macro expansion is not a valid character string literal, the behavior is undefined.
The following examples demonstrate the use of the
# operator:
#define STR(x) #x
#define XSTR(x) STR(x)
#define ONE 1| Invocation | Result of macro expansion |
|---|---|
STR(\n "\n" '\n') |
"\n \"\\n\"
'\\n'" |
STR(ONE) |
"ONE" |
XSTR(ONE) |
"1" |
XSTR("hello") |
"\"hello\"" |
Related information