[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)
