Disponible la versión 6 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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;
}