Otlet kellene - C macro

Vomberg István vomberg at chemotron.hu
Sat Mar 13 14:25:14 CET 2004


Ugyanezt a problémát én a következő módon oldottam meg.

Egy header fileban vannak a makrók:

#define BT_INIT() \
char *BugTraceString = alloca (1000); \
char *BugTraceUserString = alloca (1000)

#define BUGTRACE(s) \
sprintf (BugTraceString, "%s | File: %s, Line: %d, PID: %d, ParentPID:
%d", s, __FILE__, __LINE__, getpid(), getppid()); \
BugTrace (BugTraceString)

Használata pedig:

void fuggveny (int signal_number)
{
BT_INIT();

  sprintf (BugTraceUserString, "Csinalas van a %d helyen, %d PID.\n",
Valami_valtozo, (int)getpid());
  BugTrace (BugTraceUserString);
  itt_meg_csinal_valamit ();
}

Természetesen minden függvény lokális deklarációs részében ott van a
BT_INIT, viszont szálbiztosan kezelődik le a dolog.

Ja, természetesen a makróban található BugTrace() függvény szálbiztosan
van megírva oszt csókolom.
A BugTrace() függvény még hozzáírja a pontos időt és egy adott helyen
lévő fájlba pakol.

Mindez Linux, gcc alatt.

I.

2004-03-13, szo keltezéssel 12:20-kor Moczik Gabor ezt írta:
> Nna, a __FILE__ es a __LINE__ ket olyan makro, amit a preprocesszor allit 
> elo (WatcomC) es az aktualis forraskod fileneve es az aktualis sor szama.
> Ez az ami miatt nem lehet fuggvennyel, mert abban egyszer irom le, es mindig 
> a fuggveny torzsenek filenevet es soranak szamat irja ki. Amit meg 
> helyettesiteni kene az az fprintf(...). Lathato hogy az 
> fptintf(logstream,"%s (%d)",__FILE__,__LINE__) mindig ugyan az, nem kene 
> folyton leirogatni. De a formatstring vegehez jo lenne a sajat parametereket 
> formatumat odatenni, meg az fprintf vegere a tetszoleges szamu parametert.
> Az elso problema nem gond, de a valtozo parameterek...
> 
> A ...-ot kellene kitalalni:
> #define LOGF(my_format,...) fprintf(logstream,"%s 
> (%d)"#my_format,__FILE__,__LINE__,...)
-- 
Vomberg István <vomberg at chemotron.hu>
Chemotron Inc.   www.chemotron.hu



More information about the Elektro mailing list