Files
cppdraft_translate/cppdraft/cpp/stringize.md
2025-10-25 03:02:53 +03:00

56 lines
3.0 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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.3The # operator[cpp.stringize]") is a [*string-literal*](lex.string#nt:string-literal "5.13.5String 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.3The # 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.6Header names[lex.header]")*s*,[*character-literal*](lex.ccon#nt:character-literal "5.13.3Character literals[lex.ccon]")*s*,
and [*string-literal*](lex.string#nt:string-literal "5.13.5String 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.6Header names[lex.header]"),[*character-literal*](lex.ccon#nt:character-literal "5.13.3Character literals[lex.ccon]"),
or [*string-literal*](lex.string#nt:string-literal "5.13.5String 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)