2010-06-06 6 views
2

Je jouais un peu avec des fonctions avec des arguments variables, et j'ai décidé de créer une fonction pour créer des vecteurs avec les arguments. Ma fonction pour créer un vecteur int travaillé ...Utiliser une fonction avec des chaînes d'argument variables

vector<int> makeIntVector(int numArgs, ...) { 
    va_list listPointer; 
    va_start(listPointer, numArgs); 
    vector<int> made; 
    for(int a = 0; a < numArgs; a++) 
     made.push_back(va_arg(listPointer, int)); 
    va_end(listPointer); 
    return made; 
} 

mais pas ma fonction pour créer un vecteur string:

vector<string> makeStringVector(int numArgs, string something, ...) { 
    va_list listPointer; 
    va_start(listPointer, something); 
    vector<string> made; 
    for(int a = 0; a < numArgs; a++) 
     made.push_back(va_arg(listPointer, string)); 
    va_end(listPointer); 
    return made; 
} 

qui bloque le programme. Qu'est-ce que je fais mal?

Répondre

4

Tenter de transmettre une chaîne en tant que paramètre varaidic donne un comportement indéfini: "Si l'argument a un type de classe non-POD (article 9), le comportement n'est pas défini." (§ 5.2.2/7 de la norme).

0

Je ne suis pas sûr mais j'étudierais le fait que va_* sont des macros, int un type "primitif" tandis que string ne l'est pas. Peut-être que cela cause le problème quelque part.

EDIT: g ++ donne un avertissement important: ne peut pas recevoir d'objets de type non-POD 'struct std :: string' à '...'; appel abandonnera à l'exécution

1

Les fonctions d'arguments variables ne doivent pas être utilisées en C++.

Le premier argument est qu'ils ne sont sûrs que pour les POD comme int ou char *, en passant un type non-POD C++ a un comportement indéfini.

Au lieu de créer une fonction avec une longue liste d'arguments, pourquoi ne pas simplement créer un vecteur et y repousser vos chaînes?

+1

'Pourquoi ne pas simplement créer un vecteur et y repousser vos chaînes? Parce que cela devient vraiment fastidieux: P – wrongusername

+0

C++ 11 semble y remédier avec ses listes d'initialisation. Hourra! –

Questions connexes