2016-11-28 2 views
3

Je veux faire varargs fonction pour libérer plusieurs pointeurs à la fois, surtout pour nettoyer le code. J'ai donc:Arguments variables sans premier argument - qu'est-ce qui appartient à va_start?

void free_all(...) { 
    va_list arguments; 
    /* Initializing arguments to store all values after last arg */ 
    // but there are no args! 
    va_start (arguments, ?????); 
    /* we expect the caller to send last argument as NULL **/ 
    void* pointer = va_arg (arguments, void*); 
    while((pointer = va_arg (arguments, void*))!=NULL) { 
     free(pointer); 
    } 
    va_end (arguments);     // Cleans up the list 
} 

Alors quoi mettre en va_start (arguments, ?????)?

Répondre

3

Ce n'est tout simplement pas possible. Vous DEVEZ toujours avoir un argument non vararg. Dans votre cas

void free_all(void *first, ...); 

pourrait fonctionner.

+0

Est-ce une limitation technique, ou simplement quelque chose qui n'est pas implémenté? (Ici, je suis simplement curieux de savoir comment cela fonctionne) –

+0

C'est la façon dont cela fonctionne. Il serait impossible de l'implémenter autrement. Au moins, je pense que ce serait le cas. –

+1

@ TomášZato, c'est un oubli de la norme IMO. Cet argument supplémentaire est un crochet dans le cadre de la pile. Théoriquement, cela pourrait être accompli sans cela. – StoryTeller