OFFTOPIC: Makra s prom. poctem parametru
Ferdinand Prantl
prantl na praha1.ff.cuni.cz
Pátek Květen 21 09:49:42 CEST 1999
> Chci si udelat funkci ktera me bude nekam logovat chyby programu. Chtel bych aby
> v tom logu bylo krome vlastni chybove hlasky i jmeno modulu a cislo radky kde
> k chybe doslo. Takze deklarace funkce vypada takto
>
> void log_chyb(char *modul, int c_radku, char *hlaska);
>
> a volani treba:
>
> log_chyb(__FILE__,__LINE__,"Nepodarilo se otevrit soubor");
>
> To __FILE__,__LINE__ me zrovna moc nebavi psat, tak jsem udelal makro
>
> #define CHYBA(x) log_chyb(__FILE__,,__LINE__,(x))
>
> a volani se zjednodusi na CHYBA("Nepodarilo se otevrit soubor");
> Nevim jak vlastne tyhle vnoreny makra maji spravne fungovat, ale tohle jsem
> zkusil prelozit na Linuxu s gcc a fungovalo to, takze doufam ze to neni nejaka
> zvrhlost. Me to bohuzel neuspokojilo, tu funkci log_chyb() chci upravit tak,
> aby pracovala jako klasicke printfy, tj. abych mohl volat:
>
> CHYBA("Nepodarilo se otevrit soubor %s",jmeno_souboru);
>
> upravit tu funkci log_chyb umim, to neni problem, ale nedokazu upravit to
> makro, zkousel jsem tri tecky, ale to se prekladaci nelibilo a ani se mu
> nedivim. Nic jineho me nenapadlo, budu muset opravdu v kazdem volani psat
> __FILE__,__LINE__?
>
> Diky za napady.
makro vic parametru neumi - trochu si zaprasim - jde to obejit
uzavrenim paremtru do zavorek - pak je z nich jeden
--------------------- cut here
#include <stdarg.h>
#include <stdio.h>
#define POSID __FILE__, __LINE__
#define CHYBA(args) log_chyb args
void log_chyb (const char *hlaska, ...)
{
va_list args;
va_start (args, hlaska);
vprintf (hlaska, args);
va_end (args);
}
int main (void)
{
CHYBA (("%s:%d, %s\n", POSID, "textik"));
return 0;
}
--------------------- cut here
je to size takovy divny, ale doufam, ze to funguje. Klofu to z koule,
ale je to jen par radek ...
> A jeste jedna drobnost: Da se z C volat funkce prelozena s C++? Proste neco jako
> extern "C" f();
> ale obracene?
nejde - kazdy kompilator si ji okrasli jinak i kdyz si zjistite skutecne
jmeno prelozene funkce, bojim se, ze kraslici znaky Vam prekladac
nezbasti ...
Ferda
-------------------------
Ferdinand Prantl
LVT FF UK
e-mail: prantl na ff.cuni.cz
www: http://www.ff.cuni.cz/~prantl
Další informace o konferenci Linux