Alle,C++ va_arg typecast ausgabe
Ich schreibe eine kleine C++ App und bin durch dieses Problem ratlos geworden. Gibt es eine Möglichkeit, den Fehler beim Zugriff auf das Element aus dem va_list-Makro mithilfe von va_arg zu erstellen (und später zu fangen), wenn der Elementtyp nicht erwartet wird. ZB: -
count=va_arg(argp,int);
if (count <= 0 || count > 30)
{
reportParamError(); return;
}
Nun, wenn ich einen typedef statt int bin vorbei, erhalte ich Müll Wert auf MS-Compiler, aber 95% der Zählzeit wird Wert 0 auf gcc (auf 64-Bit SLES10 sys). Gibt es eine Möglichkeit, eine Art der Überprüfung zu erzwingen, so dass ich einen Fehler bekomme, der in einem Catch-Block gefangen werden kann?
Alle Ideen dazu wären sehr hilfreich für mich. Oder gibt es einen besseren Weg, dies zu tun? Der Funktionsprototyp ist: -
void process(App_Context * pActx, ...)
Die Funktion als
process(pAtctx,3,type1,type2,type3);
genannt wird Es ist wichtig, für pActx als erster Parameter übergeben werden und somit nicht als 1. Parameter zählen passieren kann.
-Update-1
Ok, das klingt seltsam, aber nargs scheint nicht von va_list auf SLES10 gcc zu Teil. Ich musste setzen
#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif
Nach der Verwendung, Parameter folgen Narg nicht Müll Werte. Dies führt jedoch Compiler/Plattform basierte #ifdefs .... Danke Chris und Kristopher
Warum nicht die Zählung zum 2. Parameter machen? 'void process (App_Context * pActx, std :: size_t nargs, ...);' –
@Chris, danke für deinen Vorschlag. Ich war mit dieser Option gegangen, aber mit Gcc, der 1. Parameter (Typ 1) nach NARGS bekommt Müll Wert. Der letzte Parameter erhält auch einen ungültigen Wert.Ich nehme an, dass nargs auch Teil von va_list im Sinne von va_start (argp, App_Context *) gefolgt von va_arg (argp, int) ist. – confused