Directiva #undef
§1 Sintaxis
#undef macro_identificador
§2 Descripción
Esta directiva permite indefinir una macro previamente definida (#define ( 4.9.10b). Desengancha el macro_identificador de cualquier cuerpo de macro que hubiese sido previamente asignado; el cuerpo es olvidado y el identificador indefinido. Dentro de la línea #undef no se realiza ninguna macro-expansión.
Es importante señalar esta posibilidad de un macro_identificador de estar definido o indefinido (con las directivas #define y #undef), junto con las directivas condicionales #ifdef y #ifndef ( 4.9.10e), utilizadas para chequear el estado de definición, ofrece un mecanismo muy flexible y potente para controlar muchos aspectos de la compilación.
Después de que un macro_identificador ha sido indefinido, puede ser redefinido con #define, usando el mismo cuerpo de macro u otro distinto.
El intento de redefinir un macro_identificador previamente definido proporciona un mensaje de alerta a menos que el nuevo cuerpo sea exactamente igual que el anterior. La estrategia aconsejada cuando se sospecha que puede haber definiciones previas del mismo identificador es la de siguiente esquema:
#ifndef BLOCK_SIZE
#define BLOCK_SIZE 512
#endif
§3 En ocasiones esta directiva sirve para que una librería se cargue como una macro o como una función. Como
ejemplo, se adjunta la información sobre la función/macro ispalpha()
§3.1 Sintaxis
#include <ctype.h>
int isalpha(int c);
§3.2 Descripción
isalpha es una rutina de la Librería Estándar que existe en dos versiones, como función y como macro para sustitución inline ( 5). Se trata de una función que permite saber si un determinado carácter "c", que se pasa como argumento numérico (codificado ASCII), es o no un carácter alfabético. La función hace su determinación consultando una tabla de valores. Esta tabla está afectada por la definición de una constante denominada LC_LOCALE. Por defecto el valor de esta constante está definida de modo que son considerados alfabéticos los caracteres A - Z y a - z. Esta función devuelve un valor distinto de cero si es una letra, y cero si no lo es.
Se puede hacer que el compilador utilice la función en vez de la macro indefiniéndola.
§3.3 Ejemplo
#include <stdio.h>
#include <ctype.h>
int main(void) {
char c = 'C';
if (isalpha(c))
printf("%c es un carácter del alfabeto\n",c);
else
printf("%c no es un carácter del alfabeto\n",c);
return 0;
}
En esta versión el compilador sustituye isalpha por una macro. En cambio en la que sigue se efectúa una llamada a una función de librería.
#include <stdio.h>
#include <ctype.h>
#undef isalpha
int main(void) {
char c = 'C';
if (isalpha(c))
printf("%c es un carácter del alfabeto\n",c);
else
printf("%c no es un carácter del alfabeto\n",c);
return 0;
}