-
Bei va_start() muss der _letzte_ Parameter angegeben werden.
In deinem Beispiel also
va\_start(additional\_arguments, arg\_string);
-
va_arg() nimmt nunmal keine chars oder shorts, etc. Den Grund hat Semjon in seinem Post schon genannt. An einem Beispiel verdeutlicht:
void func(char c);
. Wenn du dieser Funktion die Zahl 5 übergibts, dann wird der Wert intern in nem int abgespeichert, und in der Funktion automatisch wieder nach char zurückverwandelt, ohne dass Du dich darum kümmern musst.
Wenn du aber „variadic functions“ (das sind die drei Punkte) benutzt, musst man sich um die Umwandlung der typen selbst kuemmern. Also folgendes Beispiel ist macht evtl. ein wenig deutlich was passiert:
#include
#include
void variadic\_function(const char\* text, ...)
{
va\_list ap;
char var;
int intvar;
// dies funktion erwartet einen char.
va\_start(ap, text);
var = (char)va\_arg(ap, int);
va\_end(ap);
// testhalber nochmal holen, diesmal aber als int
va\_start(ap, text);
intvar = va\_arg(ap, int);
va\_end(ap);
printf("%-20s: %d (int wuerde sein: %d)\n", text, var, intvar);
}
int main(void)
{
// die funktion erwartet einen char
variadic\_function("pass (char)5", (char)5);
// folgendes schadet aber auch nicht, weil ja sowieso
// platz fuer einen ganzen int ist, und nicht nur fuer char.
variadic\_function("pass 5", 5);
variadic\_function("pass (short)5", (short)5);
variadic\_function("pass (int)5", (int)5);
// wenn es aber ueber -128..127 hinausgeht, gibts probleme
// weil die funktion nur char erwartet und den Wert
// auch entsprechend interpretiert.
variadic\_function("pass 200", 200);
// davor schuetzt man sich am besten, indem man
// den expliziten cast hinschreibt, auch wenn er an sich
// nicht noetig waere.
// (hier sieht man sofort: (char)200 geht bestimmt schief)
variadic\_function("pass (char)200", (char)200);
return 0;
}
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]