[cpp.stringize] # 15 Preprocessing directives [[cpp]](./#cpp) ## 15.7 Macro replacement [[cpp.replace]](cpp.replace#cpp.stringize) ### 15.7.3 The # operator [cpp.stringize] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1795) Each# preprocessing token in the replacement list for a function-like macro shall be followed by a parameter as the next preprocessing token in the replacement list[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1802) A [*character string literal*](#def:character_string_literal "15.7.3 The # operator [cpp.stringize]") is a [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]") with no prefix[.](#2.sentence-1) 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)[.](#2.sentence-2) Let the [*stringizing argument*](#def:stringizing_argument "15.7.3 The # operator [cpp.stringize]") be the preprocessing token sequence for the corresponding argument with placemarker tokens removed[.](#2.sentence-3) Each occurrence of whitespace between the stringizing argument's preprocessing tokens becomes a single space character in the character string literal[.](#2.sentence-4) Whitespace before the first preprocessing token and after the last preprocessing token comprising the stringizing argument is deleted[.](#2.sentence-5) 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[*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]")*s*,[*character-literal*](lex.ccon#nt:character-literal "5.13.3 Character literals [lex.ccon]")*s*, and [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]")*s* (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 andU+005c reverse solidus character of a[*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]"),[*character-literal*](lex.ccon#nt:character-literal "5.13.3 Character literals [lex.ccon]"), or [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]"), and each new-line character is replaced by the two-character sequence \n[.](#2.sentence-6) If the replacement that results is not a valid character string literal, the program is ill-formed[.](#2.sentence-7) The character string literal corresponding to an empty stringizing argument is ""[.](#2.sentence-8) The order of evaluation of# and## operators is unspecified[.](#2.sentence-9)