64/sqr(4)
viene espansa per 64/4*4
.
dovete parenthetise corpo macro e dovrebbero anche mettere tra parentesi aroud l'argomento:
#define sqr(a) ((a)*(a))
Resa: 64/(4*4)
Nota che le macro sono puri testuali sostituzioni effettuate dal C preprocessoreprima dello inizia la compilazione effettiva.
Un approccio migliore e type-safe sarebbe quella di utilizzare una funzione inline
:
static inline int sqr(int a)
{
return a * a;
}
Questo sarà probabilmente inline nel codice chiamante dal compilatore tanto quanto la macro sarebbe. OTOH, il compilatore potrebbe benissimo decidere di non farlo, a seconda dell'euristica interna. In generale, è necessario affidarsi al compilatore per utilizzare il modo corretto, a meno che non si verifichino seri problemi di prestazioni/dimensioni del codice.
Questo proteggerà anche contro la valutazione dell'argomento a
due volte. Cioè critica se ci sono effetti collaterali come
int i[2], *p = i;
sqr(*p++);
Per la versione macro, questo si tradurrà in un comportamento indefinito (ordine indefinita di valutazione):
((*p++) * (*p++))