Los Macros (asi como los includes) se manejan en el preprocesador de C que es un paso anterior separado de la compilación. Y permiten basicamente la definición de un termino que será remplazando siempre en el momento de la compilación por la expresión que se defina. El ejemplo típico es la definición de constantes, ej:


#define MAX_SIZE 1000

Macros con Variables

También pueden usarse Macros con variables, ej:


#include <stdio.h>
#define max(A, B) ((A) > (B) ? (A):(B))
int main() {
	int x = 20;
	int y = 10;
	int z;

	//Gets transformed to z = ((x + y) > (y - 10) ? (x + y):(y - 10));
	z = max(x + y, x - 10);
	//prints 30
	printf("%dn", z);

	//Gets transformed to z = ((++x) > (++y) ? (++x):(++y);
	z = max( ++x, ++y);
	// ++ is doubly evaluated
	//So x and y are doubly incremented
	//prints 22
	printf("%dn", z);

}

Nota: Hay que tener cuidado con los efectos secundarios que se pueden causar ver ejemplo de ++x

Cuidado con comerse los parentesis y los efectos secundarios que se pueden causar


#include <stdio.h>
#define square(x) x * x
#define square_works(x) (x) * (x);

int main() {
	int x = 20;
	int y = 10;
	int z;

	//Gets transformed to z = x + y * x + y
	//And because of precedence order is z = x + (y * x) + y
	z = square(x + y);
	//prints 230
	printf("%dn", z);

	//Gets transformed to z = (x + y) * (x + y)
	z = square_works(x + y);
	//prints 900
	printf("%dn", z);

}

Para desdefinir un Macro se puede usar undef y se puede usar ( también para includes o defines ) estructuras condicionales con if, ej:


#if SYSTEM_BITS == 64
	#define MAX_SIZE = 2^63
#elif
	#define MAX_SIZE = 2^31
#endif

Referencias

The C Programming Language, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991