Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

stdarg.h

0 views
Skip to first unread message

Thomas Rachel

unread,
Nov 15, 2009, 1:06:33 PM11/15/09
to
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?

TIA,


Thomas

Thomas Rachel

unread,
Nov 15, 2009, 1:07:39 PM11/15/09
to
Hallo,


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

Ralf Damaschke

unread,
Nov 15, 2009, 4:23:02 PM11/15/09
to
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.

-- Ralf

Thomas Rachel

unread,
Nov 16, 2009, 1:55:59 AM11/16/09
to
Ralf Damaschke schrieb:

>> 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

Michael Karcher

unread,
Nov 16, 2009, 6:10:32 AM11/16/09
to
Thomas Rachel <nutznetz-drei-...@spamschutz.glglgl.net> wrote:
> > 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.

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

0 new messages