tengo este pedazo de código (resumido) ...¿Hay trampas usando varargs con parámetros de referencia
AnsiString working(AnsiString format,...)
{
va_list argptr;
AnsiString buff;
va_start(argptr, format);
buff.vprintf(format.c_str(), argptr);
va_end(argptr);
return buff;
}
Y, sobre la base de que el paso por referencia se prefiere que sea posible, lo cambié esta manera.
AnsiString broken(const AnsiString &format,...)
{
... the rest, totally identical ...
}
Mi código de llamada es la siguiente: -
AnsiString s1, s2;
s1 = working("Hello %s", "World");
s2 = broken("Hello %s", "World");
Pero, S1 contiene "Hola Mundo", mientras que S2 tiene "Hola (nulo)". Creo que esto se debe a la forma en que va_start funciona, pero no estoy exactamente seguro de lo que está pasando.
Una buena explicación de lo que está pasando. –
Este es un buen ejemplo de la proverbial abstracción con fugas. va_start parece una especie de magia, pero en realidad es solo un poco de hackers aprobados por el compilador. – Eclipse