Anuncios

Bienvenidos sean a este post, hoy veremos como son los preprocessors.

Anuncios

En el post anterior vimos como se trabaja verdaderamente con los archivos de encabezado y en este post vimos uno de los comandos llamado preprocessors como fue ifndef y define, si bien hablamos muy superficialmente sobre como eran ellos y en este post vimos como trabajar con define aqui veremos al resto y para que sirven.

Anuncios

Los preprocessors pueden ser herramentas muy utiles pero que deben ser usados con un gran cuidado, si bien no podemos eliminarlos completamente porque son parte esencial de la programacion con multiples archivos, si debemos lograr un equilibrio sin abusar de ellos pero tampoco poner demasiado pocos pero antes preguntemos, que es un preprocessor?

Es un simple procesador de macro que procesa el texto del codigo de un programa de C antes que el programa sea leido por el compilador

el tinchicus
Anuncios

Estos son controlados mediante unas directivas de linea de comandos de preprocesadores y transforman el codigo original mediante macros incrustadas en dicho codigo para substituir, agregar o remover texto basado en las directivas informadas, pero recuerden que el resultado de esta modificacion debe ser un codigo valido de C, vamos a ver de forma muy basica cuales soa las directivas de preprocessors que disponemos:

  • #include, inserta texto (codigo) desde otro archivo de origen
  • #define, agrega una definicion de un macro preprocesador
  • #undef, remover una definicion de un macro preprocesador
  • #ifdef, condicional que incluye algun texto si el macro esta definido
  • #ifndef, idem al anterior pero cuando el macro no esta definido
  • #if, idem a los anteriores pero lo hara en base a la condicion informada
  • #else, condicional que incluye texto cuando falla #if, #ifdef, #ifndef o #elif
  • #elif, abreviacion para #else #if, en una sola directiva
  • #error, produce un error de compilacion con el mensaje informado
  • #pragma, especifica información dependiente de la implementación para el compilador.
Anuncios
Anuncios

Existen otros mas pero son de uso mas especifico, pero como podran ver su principal caracteristica es trabajar con la substitucion de texto en nuestros codigos, y como podran adivinar esto conlleva a un gran poder pero tambien a un gran peligro porque si bien hace una substitucion textual estos no entienden nada de la sintaxis del codigo en C, si observan son basicamente comandos de programacion y esto puede ocasionar uno de los mayores peligros como es intentar utilizarlo como un lenguaje de programacion, dado que son simplemente macros que no comprenden de sintaxis resultando en un codgo que si se compilara pero puede tener conductas impredecibles, por esto se aconseja siempre tratar de utilizarlos de la manera mas simple posible, veamos algunos consejos sobre que si y que no hacer con los preprocessors:

  • Es preferible usar una funcion en C en lugar de de un preprocessor
  • Utilzalos como un ultimo recurso para mejorar la performance aunque esto realmente no signifique que sea verdad
  • Es preferible usar const por sobre #define, porque nunca podremos saber si la macro se usa correctamente
  • Lo mismo aplica para enum, se debe privilegiar sobre #define
  • Controlar el uso de los archivos de encabezado mediante directivas simples
Anuncios

Este ultimo punto lo vimos en un ejemplo en este post, repasemos como era:

#ifndef _ORDENA_NOMBRES_H_
#define _ORDENA_NOMBRES_H_

... instrucciones ...

#endif
Anuncios

En la primer linea chequeamos si no esta definida esta constante procede a ejecutar las instrucciones en el archivo, pero observemos que nuestro primer paso es definirla, en cualquier caso al momento de volver a invocar a este archivo donde vuelve a chequearlo y al estar definida no cargara nada del archivo asegurando que sea incluido una sola vez, por ultimo observen que al final pusimos el #endif para cerrar el condicional, esto es una forma simple de garantizar uniquidad en el procesamiento del codigo, tambien esto nos permite realizar algo mas.

Anuncios

Depurando con el preprocessor

Cuando nos referimos a depurar estamos hablando de como manejar el codigo ante errores o excepciones, si bien estuvimos usando varios de los preprocessors en nuestros codigos como #include, en algunos #define y en este post al #ifndef, si bien siempre es recomendable usar funciones, como mencionamos antes, pero con los preprocessors podemos crear herramientas simples para la depuracion, veamos un ejemplo que podemos hacer:

#if CODIGO_TEST
	// codigo insertado para ser ejecutado al final del programa
	fprintf(stderr, "Este es un test, llegamos hasta aqui");
#endif
Anuncios

Vamos a suponer que lo definimos en nuestro codigo, por lo tanto cuando TEST_CODE tenga un valor distinto de cero, procedera a informar que estamos en el test, pero para ello podemos agregar la siguiente linea en el codigo principal:

#define CODIGO_TEST 1
Anuncios

Esto hara que entremos en el modo test por lo tanto se cumplira el condicional, para desactivarlo simplemente pasamos el valor de 1 a 0, pero tambien podemos hacerlo por fuera al momento de compilarlo, vamos a ver el siguiente ejemplo:

$ gcc libs/funciones.c program.c -o program -D CODIGO_TEST=1
Anuncios

Observen que atraves de la opcion -D seguido del identificador y el valor sera lo mismo que vimos anteriormente, a continuacion les dejo un ejemplo de como hacer un test sobre una variedad de caracteristicas de nuestro codigo:

#if defined DEPURAR
 #define DEPURAR_LOG 1
 #define DEPURAR_LOG_ALIGN 0
 #define DEPURAR_LOG_SHADOW 0
 #define DEPURAR_LOG_WINDOW 0
 #define DEPURAR_LOG_KEEPONTOP 1
 #define DEPURAR_LOG_TIME 1
#else
 #define DEPURAR_LOG 0
 #define DEPURAR_LOG_ALIGN 0
 #define DEPURAR_LOG_SHADOW 0
 #define DEPURAR_LOG_WINDOW 0
 #define DEPURAR_LOG_KEEPONTOP 1
 #define DEPURAR_LOG_TIME 0
#endif
Anuncios

Por ejemplo si nosotros definimos a DEPURAR al momento de compilarlo este verificara si debe depurar o no el codigo, observen como establece algunos valores con 1 para poder hacer las verificaciones pertinentes, de lo contrario sera todo en 0 y no hara nada, para ir resumiendo veamos algunas caracteristicas que tendremos con el uso de preprocessors:

  • Incluir archivos de encabezado
  • Limitar el procesamiento redundante de archivos de encabezado
  • Para depuracion de cavernicolas 😂
  • Excluir un bloque de instrucciones al momento de hacer pruebas con el codigo
Anuncios

En resumen, hoy hemos visto a preprocessors, que son, como trabajan, para que se utilizan, como hemos estado utilizando algunos, los posibles riesgos que podemos tener, asi como tambien puede beneficiarnos, asi como tambien hemos repasado algunos usos que ya hemos hecho, y una vista muy superficial de como hacer una «depuracion», espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50