typestar

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

  1. Sin paréntesis, SQUARE(1 + 2) se expande a 1 + 2 * 1 + 2.
  2. Envolver los parámetros y el resultado lo arregla.
  3. Un parámetro usado dos veces también evalúa su argumento dos veces.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 4 en Macros; paso 2 de 12 en Preprocesador y encabezados.

← Anterior Siguiente →