Bio: Kompliziertes typedef in C

Sup!

Aus irgendeinem Grund brauche ich in meinem Programm ein Array von Zeigern auf Funktionen mit Rückgabewert int. Also quasi:

int (*func_array[])() = {func1,func2};

(func_array ist ein Vektor/Array von Zeigern auf Funktionen undefinierten Types mit Rückgabewert int)

Nun ist die Frage, ob man mit typedef einen Typen dafür deklarieren könnte.
Also ob mit typedef [irgendwas] func_array_type einen Typen definieren kann, so dass man dann mit

func_array_type func_array = {func1, func2}; ein Funktions-Array definieren könnte.

Vielleicht geht ja einfach

typedef int (*func_arraytype[])(); ?

Möglicherweise kann man aber in einem typedef auch keine Vektor/Array-Klammern [] ohne konstanten Wert nutzen, und es muss eher

typedef int (*func_arraytype)(); ?

und

func_array_type func_array[] = {func1, func2};

heissen?

Irgendwelche Tipps?

Gruesse,

Bio

  1. Hallo Bio,

    Irgendwelche Tipps?

    Kernighan/Ritchie, Programmieren in C. *scnr*

    Spaß beiseite:

    #include <stdio.h>  
      
    int func1() {  
            printf("func1\n");  
            return 1;  
    }  
      
    int func2() {  
            printf("func2\n");  
            return 2;  
    }  
      
    typedef int ((*func_arraytype[])());  
      
    func_arraytype func_array = { func1, func2 };  
      
    int main (int argc, char **argv) {  
            printf("%d\n", func_array[0]());  
            printf("%d\n", func_array[1]());  
            return 0;  
    }
    

    Viele Grüße,
    Christian

    1. Sup!

      Kernighan/Ritchie, Programmieren in C. *scnr*

      Liegt neben mir, aber genützt hat's nichts! ;-)

      Vielen Dank auf jeden Fall,

      Gruesse,

      Bio
      ---
      Do ut des!

  2. Hallo Bio,

    Aus irgendeinem Grund brauche ich in meinem Programm ein Array von Zeigern auf Funktionen mit Rückgabewert int. Also quasi:

    int (*func_array[])() = {func1,func2};

    Müsste es nicht richtig

    int (*func_array)()[] = {func1,func2};

    heißen? Also erst den Basistyp deklarieren, dann die Array-Indexklammern? Die Indexklammern müssten meiner Ansicht nach außerhalb der runden Klammern stehen, weil die Array-Bildung ja der letzte Schritt bei der Deklaration dieses komplexen Typs ist.
    Ich habe so aufwendige Konstrukte bisher nicht benutzt aber...
    Mit einer zweistufigen Deklaration müsste es eigentlich klappen:

    typedef int(*func)() functype;
    functype func_array[] = {func1, func2};

    (func_array ist ein Vektor/Array von Zeigern auf Funktionen undefinierten Types mit Rückgabewert int)

    Genau das müsste nach meiner Einschätzung bei der obigen Deklaration herauskommen.

    So long,

    Martin

    1. Sup!

      Müsste es nicht richtig

      int (*func_array)()[] = {func1,func2};

      heißen?

      Nein, das müsste man dann nämlich so lesen:

      func_array ist ein Zeiger auf eine Funktion mit Rückgabewert int ... und dann hängen die eckigen Klammern da so in der Landschaft rum und ergeben keinen Sinn. In jedem C-Buch gibt es so einen Abschnitt "komplizierte Vereinbarungen interpretieren", der hilft, das zu verstehen.

      Gruesse,

      Bio