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

56 lines
3.0 KiB
Markdown
Raw Permalink 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)