C Language Sostituzione macro


Esempio

La forma più semplice di sostituzione macro è definire una manifest constant , come in

#define ARRSIZE 100
int array[ARRSIZE];

Definisce una macro simile a una funzione che moltiplica una variabile per 10 e memorizza il nuovo valore:

#define TIMES10(A) ((A) *= 10)

double b = 34;
int c = 23;

TIMES10(b);   // good: ((b) *= 10);
TIMES10(c);   // good: ((c) *= 10);
TIMES10(5);   // bad:  ((5) *= 10);

La sostituzione viene eseguita prima di qualsiasi altra interpretazione del testo del programma. Nella prima chiamata a TIMES10 il nome A della definizione viene sostituito da b e il testo espanso viene quindi inserito al posto della chiamata. Si noti che questa definizione di TIMES10 non è equivalente a

#define TIMES10(A) ((A) = (A) * 10)

perché questo potrebbe valutare la sostituzione di A , due volte, che può avere effetti collaterali indesiderati.

Quanto segue definisce una macro simile a una funzione il cui valore è il massimo dei suoi argomenti. Ha i vantaggi di lavorare per qualsiasi tipo compatibile di argomenti e di generare codice in linea senza il sovraccarico delle chiamate di funzione. Ha gli svantaggi di valutare l'uno o l'altro dei suoi argomenti una seconda volta (compresi gli effetti collaterali) e di generare più codice di una funzione se invocato più volte.

#define max(a, b) ((a) > (b) ? (a) : (b))

int maxVal = max(11, 43);              /* 43 */
int maxValExpr = max(11 + 36, 51 - 7); /* 47 */

/* Should not be done, due to expression being evaluated twice */
int j = 0, i = 0;
int sideEffect = max(++i, ++j);       /* i == 4 */

Per questo motivo, tali macro che valutano i loro argomenti più volte vengono solitamente evitate nel codice di produzione. Dal momento che C11 c'è la funzione _Generic che consente di evitare tali invocazioni multiple.

Le abbondanti parentesi nelle macro espansioni (lato destro della definizione) assicurano che gli argomenti e l'espressione risultante siano collegati correttamente e si adattino bene al contesto in cui viene chiamata la macro.