Forum: Compiler & IDEs Variable Argument-Listen übergeben


von Christian U. (z0m3ie)


Lesenswert?

Hallo,

ich muss Variable Argument-Listen von einer Funktion an eine andere 
übergeben.
Gibt es da eine Möglichkeit ? Ich kann dazu leider keine Informationen 
finden.

int test(int d, int request, ...)
{
  va_list ap;
  va_start(ap,request);
  return othertest(request,ap);
  va_end(ap);
}


so hab ichs probiert, aber leider funktioniert das nicht.

von Rolf Magnus (Gast)


Lesenswert?

1
int test(int d, int request, ...)
2
{
3
  va_list ap;
4
  va_start(ap,request);
5
  return othertest(request,ap);
6
  va_end(ap);
7
}

Wenn othertset als zweiten Parameter eine va_list haben will, geht das 
so.

von Christian U. (z0m3ie)


Lesenswert?

Ja, ich habs nun so gemacht wollte eigentlich als 2. Parameter auch ... 
haben das scheint aber nicht möglich ?!

von Uhu U. (uhu)


Lesenswert?

Doch, das ist möglich. Sieh dir mal die Prototypen der v*printf-Routinen 
an. Die machen genau das und nach dem Muster must du deine othertest() 
konstruieren.

von Christian U. (z0m3ie)


Lesenswert?

die v*print* routinen übergeben ein va_list typ und kein ... ich kann 
mich aber mit dieser lösung gut zufriedengeben

von Uhu U. (uhu)


Lesenswert?

Christian Ulrich wrote:
> die v*print* routinen übergeben ein va_list typ und kein ... ich kann
> mich aber mit dieser lösung gut zufriedengeben

Anders geht es in C nicht, da es keine Möglichkeit gibt, eine zur 
Übersetzungszeit nicht bekannte Anzahl Argumente auf den Stack zu 
pushen.

Man könnte das zwar mit Inline-Assembler machen, ist aber eine 
Sauerei...

von Christian U. (z0m3ie)


Lesenswert?

naja va_list zu übergeben reicht mir völlig. Danke nochmal.

von Gast (Gast)


Lesenswert?

kurze Frage nebenbei: Nach dem
1
return othertest(request,ap);
steht noch ein Befehl.
1
va_end(ap);
Wird der jemals erreicht?

von Uhu U. (uhu)


Lesenswert?

Gast wrote:
> Wird der jemals erreicht?

Nein.

va_end ist ein Macro, das in vielen Implementierungen leer ist, insofern 
macht das meistens nichts aus, aber streng genommen, ist es natürlich 
nicht korrekt, va_end hinter ein unbedingtes return zu schreiben. Jeder 
halbwegs optimierende Compiler würde es wegwerfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.