Consider `#define BYTECOPY(T, S) memcpy(&(T), &(S), MINSIZE(T, S))`. Before primary compilation, preprocessing replaces a function-like macro call with text according to rules for arguments, parameters, parentheses, commas, and recursive expansion. section 16.1
The replacement process performs several distinct operations:
- Temporarily disables the macro to avoid infinite recursion. section 16.1
- Scans parentheses and commas to divide the argument list, requiring balanced parentheses and the correct argument count. section 16.1
- Recursively expands macros appearing in arguments, then substitutes the resulting text into a copied replacement list. section 16.1
- Keeps macro parameters as identifiers whose special scope is limited to replacement text. section 16.1
#define BYTECOPY(T, S) memcpy(&(T), &(S), MINSIZE(T, S))
!@%STYLE%@!
{"css":"{\"css\": \"font-weight: bold;\"}","target":"[[{\"line\":0,\"ch\":0},{\"line\":0,\"ch\":7}],[{\"line\":0,\"ch\":23},{\"line\":0,\"ch\":29}]]"}
!@%STYLE%@!
Inspect the complete BYTECOPY definition and its textual replacement structure. section 16.1
A misleading function-like macro
The name `string_literal` can denote both a macro and a function. Parenthesizing the function name, as in `(string_literal)`, prevents the function-like macro from being invoked, allowing declarations and function-pointer use without textual substitution. section 16.1


