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?
TIA,
Thomas
Ist das richtig so?
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
> 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.
-- Ralf
>> Ist das richtig so?
>
> Im Prinzip ja.
Super, danke.
> 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.
Ok. Nur ist es hier so, daß ich auf einer Plattform arbeite, die an der
Stelle als Implementierungsdetail eine C-Inkompatibilität hat, bei der
char eben nicht standardmäßig nach int promotet wird - was auch bei
"default argument promotion" so ist.
Aber gut, daß Dus nochmal erwähnst - das sollte natürlich in die Doku.
> 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.
Das auch.
>> 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.
Danke!
Thomas
Oder den Code so schreiben, dass er auch auf Standard-C funktioniert:
#ifdef MY_STRANGE_IMPLEMENTATION
typedef char promoted_char;
#else
typedef int promoted_char;
#endif
Gruß,
Michael Karcher