On Thu, 13 May 2004 00:10:13 +0200, "Juan Llanos"
Post by Juan LlanosCuando aprendi algo de C no me dieron nada de defines y ahora "me obligan" a
usar un define que otra persona ha creado y no tengo ni idea de como
interpretarlo... bueno un poco si, pero me lio con el ; y con \
#define TIEMPO_EVENTO(reloj) reloj=time(NULL)
#define IMPR_EVENTO_HILO(flujo_salida, reloj, tipoHilo, hilo, temporal_mens,
macro_mensaje)\
TIEMPO_EVENTO(reloj);sprintf(temporal_mens, macro_mensaje);\
fprintf(flujo_salida, "%s, Hilo %s: %d, %s\n",ctime(&reloj), tipoHilo,
hilo, temporal_mens)
Yo "entiendo" IMPR_EVENTO_HILO imprime algo haciendo uso del fprint y con
los parametros, pero me lio un poco con las dos funciones anteriores...
Pues eso. Gracias.
Primero de todo decir que estoy de acuerdo con los comentarios que te
han hecho sobre macros. Yo tampoco soy anti-macros pero no me gustan
por varias razones: tienen efectos laterales dificiles de preveer,
ocultan el tipo de los parametros, y ademas los depuradores no
entienden de macros. Ademas desde C99 tienes disponible las funciones
inline con lo que el uso de macros con la intencion de eficiencia
todavia tiene menos justificacion.
Por otra parte, el uso de macros es conveniente combinandola con
compilacion condicional, permitiendo adaptar facilmente el codigo a
distintos entornos de compilacion . Por ejemplo echa un vistazo a la
macro assert(), esta macro se comporta de forma totalmente distinta
segun tengas definido o no NDEBUG. Pero si te fijas, la implementacion
de assert es de lo mas sencilla, simplemente o bien llama a una
funcion, o no hace nada.
En cuanto a lo que hace la macro que muestras, parece que tiene varios
efectos:
- asigna a una variable el time actual
- construye una string especificada a traves de lo que parece seria
otra macro (lo cual me parece poco pensado)
- envia a un fichero una linea con la hora, tipo de hilo, hilo y la
string previamente formada.
Con esta definicion tienes varios problemas:
- No chequea en tiempo de compilacion los tipos de los parametros
que pasaras a fprintf (muy peligroso).
- Oculta el uso de la string temporal, con lo que pierdes
consciencia de como se usa y cual deberia ser su tamaño
- Tiene todos los problemas asociados a los efectos laterales en
evaluacion de macros
Podrias haberla definido de forma totalmente distinta:
#ifdef DEBUG_EVENT
void fprintEvent( FILE* file, const char* strHilo,
int hilo, time_t *reloj, const char* msg);
IMPR_EVENTO_HILO( fsalida, reloj, tipoHilo, \
hilo, msg) \
TIEMPO_EVENTO(reloj);\
fprintEvent( fsalida, tipoHilo, hilo, reloj, msg)
#else
IMPR_EVENTO_HILO( fsalida, reloj, tipoHilo, \
hilo, msg) \
TIEMPO_EVENTO(reloj)
endif
En particular aqui si esta definido DEBUG_EVENT se llama a una funcion
que chequea convenientemente los parametros. En cuanto a la macro
TIEMPO_EVENTO, si usas C99, podria ser una funcion inline.
De todas formas no me parece muy adecuado que una macro que se supone
loguea un mensaje, tenga el efecto lateral oculto de actualizar la
variable reloj con el time actual.
Un saludo,
Martin.