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