va_list und co



  • Hallo,

    nehmen wir mal an ich habe eine Sammlung von Objekten, über die iteriert werden kann. Hier abstrahiere ich das mal durch ein Array von int:

    int array[MAXSIZE];
    int size
    

    Auf jedes Element kann nun durch eine Apply Funktion eine beliebige Funktion angewendet werden. Die Apply Funktion hat folgende Deklaration:

    typedef void (*Apply_Func)(int, va_list args);
    
    void apply(int * array, int size, Apply_Func func, ...);
    

    Die Parameter hinter func sollen an die übergebene Funktion weitergegeben werden. Hier mal ein Beispiel für apply und eine Funktion:

    void Func(int a, va_list args) {
       int b = va_arg(args, int);
       printf("%d\n", a+b);
    }
    
    void apply(int * array, int size, Apply_Func func, ...) {
       va_list args, nargs;
       va_start(args, func);
       for (int i = 0; i != size; ++i) {
         va_copy(nargs, args);
         func(array[i], args);
         va_end(nargs);
       }
       va_end(args);
    }
    

    Man könnte das auch so machen:

    void Func(int a, va_list args) {
       va_list nargs;
       va_copy(nargs, args);
       int b = va_arg(nargs, int);
       printf("%d\n", a+b);
       va_end(nargs);
    }
    
    void apply(int * array, int size, Apply_Func func, ...) {
       va_list args;
       va_start(args, func);
       for (int i = 0; i != size; ++i) {
         func(array[i], args);
       }
       va_end(args);
    }
    

    Nun meine Frage: Ist beides legal,oder wird eines von den beiden von Standard her verboten? So wie ich den Standard lese, geht beides.


Anmelden zum Antworten