Por qué las macros llevan paréntesis en C
La sustitución ignora la precedencia: cada parámetro y el cuerpo entero van entre paréntesis.
#define BAD_SQUARE(x) x * x
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int compare_expansions(void) {
int wrong = BAD_SQUARE(1 + 2);
int right = SQUARE(1 + 2);
return right - wrong;
}
int double_evaluation(void) {
int i = 1;
int bigger = MAX(i++, 0);
return bigger + i;
}
Cómo funciona
- Sin paréntesis,
SQUARE(1 + 2)se expande a1 + 2 * 1 + 2. - Envolver los parámetros y el resultado lo arregla.
- Un parámetro usado dos veces también evalúa su argumento dos veces.
Palabras clave y builtins usados aquí
intreturnvoid
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 302
- Tokens
- 67
- Ritmo de tres estrellas
- 95 tpm
Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 42 segundos.
Paso 2 de 4 en Macros; paso 2 de 12 en Preprocesador y encabezados.