domingo, 27 de mayo de 2012

Los Encabezados #include y #define

Consideremos el siguiente programa

/*Encabezados al inicio del programa*/
 #include <stdio.h>
 #define PI 3.14159
 
 int main()
 { /*Abre main */
 printf("\nPI = %f es la razon perimetro/diametro para cualquier circulo\n", PI);
 
 /*#define en #include se puden colocar en cualquier lugar en el programa */
 #define C 300000
 printf("La velocidad de la luz es C = %d km/s\n\n", C);

 return 0;
 } /*Cierra main*/

El compilador de C inlcuye un preprocesador. Cuando se incluye una linea del tipo #define PI 3.14159, el preprocesador sustituye en el código (salvo en los lugares en los que aparezca entre comillas dobles " ") cada aparición de la cadena PI por el valor flotante 3.14159. Esto vuelve al programa mucho más fácil de modificar. Si acaso necesitamos una precisión mayor para cálculos futuros, bastará con aumentar los decimales sólo en el encabezado. Piense en el caso en el que en vez de la constante simbólica PI apareciera 3.14159. Para modificar el valor tendríamos que cambiar todas las ocurrencias del número. En un programa grande esto puede representar miles de líneas. Una constante simbólica debe ir justo después de #define, por norma (pero no como una obligación) su nombre debe ir en mayúsculas y a continuación debe debe definirse su "valor", observe que no hay punto y coma (;) al final de la definición. En realidad, en el preprocesamiento la constante simbólica no tiene un valor propiamente dicho. Sólo se indica por qué literales o números deben sustituirse las apariciones en el código de la variable (en el programa siguiente aparece una definición de printf mediante una constante simbólica) La definición puede hacerse en cualquier parte del programa y a partir de ahí será válido invocarla con su nombre. Por convención y simplicidad (tampoco por obligación) los encabezados de definición se incluyen siempre al principio del programa. La línea #define C 300000 define una constante simbólica en medio de la función main.La siguiente línea hace uso de esa constante y el uso es válido.
Sea ahora el siguiente programa, el cual es bastante parecido al anterior:

 #include <stdio.h>
 #define C 300000
 #define PI 3.14159 
 #define p printf

 int main()
 { /* Abre main */
 
 p("\nLa velocidad de la luz C = %d", C);
 p("\nEl valor de PI: %f", PI);
 p("\nDe esta manera el codigo se encripta.\n");
 
 return 0;
 } /* Cierra main*/
 

Aquí no solamente se ha definido mediante constantes simbólicas PI y C, sino también la cadena printf, de tal manera que en el cuerpo de main no se escribe printf, sino p, cada vez que se quiere imprimir un mensaje. Ésta es una forma poco recomendable de escribir un programa, porque se está encriptando y complicando el código, lo cual va a dificultar que nosotros mismos, los creadores del programa, no podamos leerlo en un futuro. Sin embargo, tampoco es algo que esté prohibido. Cada recomendación debe considerarse para el caso particular que nos ocupe. Una bonita excepción a la presente recomendación puede verse en éste código, que es un compilador de C escrito en 3301 caracteres de lenguaje C por el programador francés Fabrice Bellard. Observe la ausencia total de comentarios en ese archivo. Bellard define, con constantes simbólicas, las instrucciones if, else, while, return, etc, de tal manera que logra compactar el código a niveles ilegibles para humanos. Sin embargo, el propósito de Bellard se cumple: el código es bastante pequeño. Las primeras versiones de Unix (un sistema operativo escrito en lenguaje C) eran también muy ligeras. Con fines menos generosos, algunos programadores que se dedican a escribir virus de computadoras, también requieren que su código sea muy compacto. En estos casos el espacio de memoria ocupado por el archivo es más importante que facilidad con la cual éste se pueda modificar.

 #include <stdio.h>
 #define C 300000
 #define PI 3.14159 
 #define p printf

Todos los encabezados anteriores definen constantes simbólicas o (en el caso de #include <stdio.h>) le informan al preprocesador que debe incluir los contenidos de archivos ( <stdio.h> ). Todos ellos se pueden guardar en un archivo llamado Encabezado.h, y llamarlos mediante una instrucción #include como en el siguiente programa:

#include "Encabezado.h"

 int main()
 { /* Abre main */
 
 p("\nLa velocidad de la luz C = %d", C);
 p("\nEl valor de PI: %f", PI);
 p("\nDe esta manera el codigo se encripta.\n");
 
 return 0;
 } /* Cierra main*/

Otra de las funciones del preprocesador es enlazar archivos. Para llevar a cabo estos enlaces, se debe indicar el nombre de los archivos mediante una línea como #include "Encabezado.h" Si el archivo es uno de los "preempacados" en el compilador, como stdio, o math, entonces sólo se indican entre paréntesis angulares y terminados con la extensión .h; si son archivos definidos por el usuario, deben incluirse entre comillas dobles (" "). El nombre de los archivos de encabezado definidos por el usuario deben guardarse en el mismo directorio (carpeta) en el que guardamos el programa que los llama y por convención (no por obligación) se guardan también con la extensión .h (indica que se trata de un header)
________________________________________________________________________________________________
Esta entrada forma parte del Curso de C con Programas Explicados Línea por Línea
Índice

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...