Disponible la nueva versión "donationware" 7.3 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;
}