sto avendo problemi in Visual Studio 2003 con il seguente:problema passando un riferimento come parametro di nome a una funzione variadic
void foo(const char*& str, ...) {
va_list args;
va_start(args, str);
const char* foo;
while((foo = va_arg(args, const char*)) != NULL) {
printf("%s\n", foo);
}
}
Quando lo chiamo io:
const char* one = "one";
foo(one, "two", "three", NULL);
ottengo:
violazione di accesso posizione lettura 0xcccccccc
sulla riga printf()
- va_arg()
ha restituito 0xcccccccc. Alla fine ho scoperto che è il primo parametro a essere un riferimento che lo spezza - se faccio un normale char * tutto va bene. Non sembra importare quale sia il tipo; essere un riferimento fa sì che fallisca in fase di runtime. Si tratta di un problema noto con VS2003 o esiste un modo in cui questo è un comportamento legale? Non succede in GCC; Non ho provato con Visual Studio più recenti per vedere se il comportamento scompare
Oh, questo è davvero ovvio in retrospettiva; Immagino che l'implementazione di 'va_start' da parte di glibc non dipenda dall'indirizzo dell'ultimo argomento con nome, capisce l'inizio del ... altro modo –
Basta trovarlo su http://www.velocityreviews.com/forums/ t281115-va_start-and-references.html che utilizzando va_start su un riferimento non è consentito. Vedi anche http://stackoverflow.com/questions/222195/are-there-gotchas-using-varargs-with-reference-parameters. – Patrick
... wow. Il mio google-fu non è forte, ho cercato per anni –