UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

14.5. Definiendo símbolos

La función print_line imprime una línea con el símbolo - repetido tantas veces como indica su único parámetro. Ese valor se le pasa a través de la variable line_width declarada y asignada en la primera línea de la función main. Si el programa tuviese que ejecutarse en dispositivos con ancho de pantalla de 20, 40 y 60 caracteres, ¿cómo obtendrías estas tres versiones? Es decir, hay que obtener tres ejecutables del mismo programa, pero que impriman líneas de diferente longitud.

El compilador dispone de una funcionalidad que es muy útil en estos casos. Edita el programa, borra la primera línea de la función main donde se define y asigna el valor a line_width. Modifica las dos líneas que llaman a la función print_line tal que sea:

print_line(LINEWIDTH);

El programa es aparentemente incorrecto, pues hay un símbolo, concretamente LINEWIDTH que se utiliza pero que no se declara en ningún sitio. Compila ahora el programa pero utilizando la opción -D seguida de la definición LINEWIDTH=80 tal y como se muestra en el siguiente comando:

$ gcc -DLINEWIDTH=80 -o main_es main_es.c

Como puedes comprobar, el compilador no informa de ningún error y el ejecutable se crea normalmente. La opción -D seguida del nombre de un símbolo y de (opcionalmente) un signo igual y un valor hace que el compilador pre-procese el código fuente y toda aparición del símbolo la reemplace por el valor dado. Ojo, que lo que hace el compilador es un reemplazo textual, en otras palabras, el programa no tiene ningún símbolo con nombre LINEWIDTH sino que en el programa hay dos líneas que en la compilación anterior se han procesado como

print_line(80)

Prueba a re-compilar con diferentes valores del símbolo LINEWIDTH y comprueba que se imprimen diferentes longitudes de línea. ¿Qué sucede si omites en el comando de compilación el signo igual y el valor? Para distinguir en el código los símbolos del programa de aquellos que se procesan con este reemplazo textual, se utiliza la convención (que no obligación) de escribirlos todos en letras mayúsculas.