62 lines
2.5 KiB
Markdown
62 lines
2.5 KiB
Markdown
[cpp.rescan]
|
||
|
||
# 15 Preprocessing directives [[cpp]](./#cpp)
|
||
|
||
## 15.7 Macro replacement [[cpp.replace]](cpp.replace#cpp.rescan)
|
||
|
||
### 15.7.5 Rescanning and further replacement [cpp.rescan]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1976)
|
||
|
||
After all parameters in the replacement list have been substituted and # and ## processing has taken
|
||
place, all placemarker preprocessing tokens are removed[.](#1.sentence-1)
|
||
|
||
Then
|
||
the resulting preprocessing token sequence is rescanned, along with all
|
||
subsequent preprocessing tokens of the source file, for more macro names
|
||
to replace[.](#1.sentence-2)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1983)
|
||
|
||
[*Example [1](#example-1)*:
|
||
|
||
The sequence#define x 3#define f(a) f(x * (a))#undef x#define x 2#define g f#define z z[0]#define h g(~#define m(a) a(w)#define w 0,1#define t(a) a#define p() int#define q(x) x#define r(x,y) x ## y#define str(x) # x
|
||
|
||
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
|
||
g(x+(3,4)-w) | h 5) & m (f)^m(m);
|
||
p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) };char c[2][6] = { str(hello), str() }; results inf(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
|
||
f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))^m(0,1);int i[] = { 1, 23, 4, 5, };char c[2][6] = { "hello", "" };
|
||
|
||
â *end example*]
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2017)
|
||
|
||
If the name of the macro being replaced is found during this scan of
|
||
the replacement list
|
||
(not including the rest of the source file's preprocessing tokens),
|
||
it is not replaced[.](#3.sentence-1)
|
||
|
||
Furthermore,
|
||
if any nested replacements encounter the name of the macro being replaced,
|
||
it is not replaced[.](#3.sentence-2)
|
||
|
||
These nonreplaced macro name preprocessing tokens are no longer available
|
||
for further replacement even if they are later (re)examined in contexts
|
||
in which that macro name preprocessing token would otherwise have been
|
||
replaced[.](#3.sentence-3)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2030)
|
||
|
||
The resulting completely macro-replaced preprocessing token sequence
|
||
is not processed as a preprocessing directive even if it resembles one,
|
||
but all pragma unary operator expressions within it are then processed as
|
||
specified in [[cpp.pragma.op]](cpp.pragma.op "15.13 Pragma operator") below[.](#4.sentence-1)
|