[ 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