stdarg.h

15/11/2009 - 19:07 von Thomas Rachel | Report spam
Hallo,

wie verwendet man denn stdarg.h richtig, wenn es um die Weitergabe von
va_lists als Parameter an andere Funktionen geht?

Angenommen, ich will eine Kaskade analog zu printf() -> vprintf() bauen.

Zum Beispiel so etwas da:


void vdumpvalues(char num, va_list va)
{
StartFrame();
while(num--) {
SendFrameByte(va_arg(va,char));
}
EndFrame();
}

void dumpvalues(uint8_t num, ...)
{
va_list va;
va_start(va,num);
vdumpvalues(num,va);
va_end(va);
}


Ist das richtig so?

Oder muß (sollte) ich vor dem Aufruf der inneren Funktion va_copy()
aufrufen?

Rufe ich va_end() in der inneren Funktion, in der àußeren Funktion oder
an beiden Stellen auf?

Ausprobieren kann ichs leider nicht, da auf der von mir verwendeten
Plattform va_end() nichts tut. Ich hàtte es aber trotzdem gerne richtig
und portabel, wenns geht.

TIA,


Thomas
 

Lesen sie die antworten

#1 Ralf Damaschke
15/11/2009 - 22:23 | Warnen spam
Thomas Rachel wrote:

wie verwendet man denn stdarg.h richtig, wenn es um die Weitergabe von
va_lists als Parameter an andere Funktionen geht?

Angenommen, ich will eine Kaskade analog zu printf() -> vprintf()
bauen.

Zum Beispiel so etwas da:

void vdumpvalues(char num, va_list va)
{
StartFrame();
while(num--) {
SendFrameByte(va_arg(va,char));
}
EndFrame();
}

void dumpvalues(uint8_t num, ...)
{
va_list va;
va_start(va,num);
vdumpvalues(num,va);
va_end(va);
}


Ist das richtig so?



Im Prinzip ja. Nur muss nach 7.15.1.1p2 der Typ in va_arg kompatibel
zum Argument *nach* der "default argument promotion" sein muss. M.a.W,
statt char ist int zu verwenden.

Gerade in comp.std.c gefunden, dass auch "uint8_t num" hier unzulàssig
ist:

7.15.1.4p4: If the parameter parmN [hier: num] is declared [...] with a
type that is not compatible with the type that results after application
of the default argument promotions, the behavior is undefined. Also ist
auch hier int zu verwenden.

Oder muàŸ (sollte) ich vor dem Aufruf der inneren Funktion va_copy()
aufrufen?


Nein.
Rufe ich va_end() in der inneren Funktion, in der à¤uàŸeren Funktion
oder an beiden Stellen auf?


Mittleres.

Ähnliche fragen