If, in the replacement list, a parameter is immediately
preceded by a
#
preprocessing token,
both are replaced by a single character string literal preprocessing token that
contains the spelling of the preprocessing token sequence for the
corresponding argument (excluding placemarker tokens)
. Let the
stringizing argument be the preprocessing token sequence
for the corresponding argument with placemarker tokens removed
. Each occurrence of whitespace between the stringizing argument's preprocessing
tokens becomes a single space character in the character string literal
. Whitespace before the first preprocessing token and after the last
preprocessing token comprising the stringizing argument is deleted
. Otherwise, the original spelling of each preprocessing token in the
stringizing argument is retained in the character string literal,
except for special handling for producing the spelling of
s,
character-literals,
and
string-literals
(including the delimiting
U+0022 quotation mark (
"))
contained within the preprocessing token:
a
U+005c reverse solidus character (
\)
is inserted before each
U+0022 quotation mark and
U+005c reverse solidus character of a
,
character-literal,
or
string-literal,
and each new-line character is
replaced by the two-character sequence
\n. If the replacement that results is not a valid character string literal,
the program is ill-formed
. The character string literal corresponding to
an empty stringizing argument is
"". The order of evaluation of
#
and
##
operators is unspecified
.