El Preprocessor
Cada línea que comienza con # es manejada por el preprocessor, un paso separado que se ejecuta antes de que el compilador real vea tu código. #include <stdio.h> literalmente pega el contenido de ese header file en su lugar; #define SQUARE(x) ((x) * (x)) define una macro que se sustituye textualmente dondequiera que se use, con su argumento sustituido — SQUARE(5) se convierte en ((5) * (5)) antes de que siquiera comience la compilación.
#include <stdio.h>
#define SQUARE(x) ((x) * (x))
#define MAX_USERS 100
int main() {
printf("%d\n", SQUARE(5));
printf("%d\n", MAX_USERS);
return 0;
}25 100
Las macros no son funciones — no tienen verificación de tipos ni parámetros reales, solo sustitución de texto — que es exactamente por qué SQUARE(x) está envuelto en paréntesis adicionales: sin ellos, SQUARE(1 + 2) se expandiría a 1 + 2 * 1 + 2, no a (1 + 2) * (1 + 2). Ningún otro lenguaje de este sitio tiene algo así: es genuinamente una capa textual separada por debajo del lenguaje C real.
A continuación: operadores bitwise — manipular bits individuales directamente.
Practice exercise
Define una macro SQUARE(x) que se expanda a ((x) * (x)), luego imprime SQUARE(9).