[ LUGOS-PROG ] #define in (...)
Goran Bervar
goran.bervar at adapti.si
Thu May 31 13:40:36 CEST 2001
Ja, si pa našel primer ko ti požre živce. Tvoj problem ni v
#ifdef/#else/#endif ampak definiranju makra za debug_printf().
Načelno lahko vedno definiraš makro, ki ima obliko funkcije, na primer:
#define int_print(a) printf("%d",a)
int_print(3);
kjer se pač argument makra prenese v nato definirano funkcijo. Število
argumentov mora biti fiksno. Ampak ne, ti hočeš makro za funkcijo, ki
sprejeme _poljubno_ število argumentov ( od vseh definiranih v C-ju so to
skoraj samo tiste it družine ..printf...). Norišnica, ti povem, tega pač
preprocesor ne zmore.
Malo si lahko pomagaš tako, da defniraš makro, ki bo sprejel točno določeno
število argumentov, v tvojem primeru nekaj kot na primer:
#define debug_printf(m_level,m_format,m_str) printf("Debug nivo =%d - " ##
m_format,m_level,m_str);
/* Tisti ## združi dva niza v enega */
Seveda pa je to ZELO nevaren makro, ker ga lahko kličeš pravilno:
debug_printf(1,"Test! %s\n","yada");
ali popolnoma narobe:
debug_printf("Test! %s\n","%s %s %s",3);
/* jako nevarno! */
Zato: NE DELAJ TEGA!!
In namesto?
Po moje je najbolj enostavno, da si vnaprej omejiš število in tip
parametrov, ki jih boš izpisoval. Napiši funkcijo, na primer:
------------------------------
/*deb_p.h*/
#ifdef DEBUG
extern int debug_print(int level, const char* sub_format, const char*
sub_string);
#else
#define debug_print(level, sub_format, sub_string);
#endif
------------------------------
/*deb_p.c*/
#ifdef DEBUG
int debug_print(int level, const char* sub_format, const char* sub_string)
{
int count = printf("Debug nivo = %d -",level);
count += printf(sub_format,sub_string); /* ali vprintf() ponekod */
return count;
}
#endif
Sedaj si precej na varnem, ker se v debug načinu preverjajo argumenti,v
release je pa tako vseeno.
LP,
goran
More information about the lugos-prog
mailing list