Typedef in Function pointer



  • Hallo zusammen,

    ich habe ein Typedef z.B.

    struct test{
       int i;
       ...
    };
    typedef struct test TestCommand;
    

    dies möchte ich nun in einem function pointer benutzen:

    void (*testptrF)(TestCommand);
    

    wenn ich diesen Code kompiliere, bekomme ich folgende Fehlermeldung:
    warning: parameter names (without types) in function declaration

    ich verstehe das nicht. Ich habe doch dem function pointer den type angegeben oder?

    Danke + Gruss,
    Hakan



  • Das sollte eigentlich gehen, das Problem muss irgendwo anders liegen. Wie sieht denn das vollständige Programm aus?



  • Hallo,

    ich habe das Problem untersucht, der Fehler lieft wirklich wo anders. Es liegt daran dass ich 2 Include Files habe. Ich nenne sie mal test01.h und test02.h. Es ist nun so das ein "typedef struct" in test01.h ein "typedef struct" aus test02.h benötigt. Auch test02.h braucht einen "typedef" aus test01.h. So steht in test01.h:

    #include "test02.h"
    ...
    struct test01{
        void (*ptrF)(TypeTest02)
        ...
    };
    ...
    typedef struct test01 TypeTest01
    

    und in test02.h:

    #include "test01.h"
    ...
    struct test02{
        TypeTest01 t01;
        ...
    };
    ...
    
    typedef struct test02 TypeTest02
    

    wenn ich nun in test01.c test01.h include kommt dann die Fehlermeldung. Auch wenn ich statt test01.h, test02.h include, kommt auch die gleiche Fehlermeldung nur mit den entsprechenden Dateinamen. Weiss jemand wie man so was lösen kann?

    Danke + Gruss,
    Haksi



  • du brauchst auf jeden Fall Include Guards.



  • supertux schrieb:

    du brauchst auf jeden Fall Include Guards.

    Die lösen das Problem aber auch nicht.

    @haksi74: Steck die Strukturen und die Typedefs in eine eigene Headerdatei. Zyklische Includedirektiven funktionieren nicht.



  • Am besten indem man struct-Definitionen aus Header-Dateien raushält.

    In einer Header-Datei definiert man allenfalls den Typ, aber nicht die Struktur selbst. Die struct-Definition kommt dann später in einer c-Datei, in der auch die Funktionen implementiert werden, die direkt auf den struct-Inhalt zugreifen. Alle anderen c-Dateien wissen nichts über den Inhalt der Struktur, sondern verwenden nur Zeiger ("opaque pointer") darauf.

    Also in test01.h:

    /*...*/
    typedef struct test01 TypeTest01;
    
    TypeTest01 *test01_create(int x);
    int test01_somefunction(TypeTest01 *test01);
    void test01_destroy(TypeTest01 *test01);
    /*...*/
    

    In test01.c:

    #include "test01.h"
    
    #include <stdlib.h>
    #include "test02.h"
    
    struct test01{
        void (*ptrF)(TypeTest02*); /* bekommt nur einen Zeiger */
        /*...*/
    };
    
    TypeTest01 *test01_create(int x)
    {
        TypeTest01 *t = malloc(sizeof *t);
        if (!t) return NULL;
        t->ptrF = something;
        /*...*/
        return t;
    }
    
    /*...*/
    

Anmelden zum Antworten