Funktionszeiger-typedef für "void foo(){};"



  • Ich steh grad irgendwie aufm Schlauch:

    irgendwo in einem Header steht:

    void rddb_destroy();
    

    in einer c-Datei wird der Header includiert und ein typedef angelegt:

    typedef void (*methodBufferdFunctionWithoutParams)
    (
    /* no parameters */
    );
    
    // irgendwo weiter unten:
    
    methodBufferdFunctionWithoutParams foo = rddb_destroy; // <-- hier warning
    foo();
    

    Der Compiler spuckt mir jetzt eine nette warning aus:

    warning C4276: 'rddb_destroy' : no prototype provided; assumed no parameters

    Als Zeilenangabe steht die allerletzte Zeile in der Quelldatei dabei, die warning
    verschwindet aber, wenn ich bei der Zweisung oben (ca. in der Mitte der Datei)
    rddb_destroy durch 0
    ersetzte.

    Der Prototyp ist auch bekannt, da ein direkter Aufruf von "rddb_destroy()" ohne
    Probleme akzeptiert wird.

    Frage:
    Was hab ich da falsch gemacht? Bei den anderen typedefs für Funktionen mit Parametern und Rückgabewert kommt die Warning nicht, wenn man die entsprechende
    Funktion zuweist...
    wird



  • Ein Prototyp ist eine Deklaration, die die Zahl und Typen der Argumente festlegt. Das:

    void rddb_destroy();
    

    ist kein Prototyp, sondern nur die Deklaration einer Funktion mit Rückgabetyp void. Willst du eine Funktion (mit Prototyp), die keine Argumente annimmt, dann musst du

    void rddb_destroy(void);
    

    schreiben. Das ganze hat historische Gründe (-> K&R) und wurde in C++ anders gelöst, aber in C ist es nunmal so.

    Warum da eine Warnung kommt, kann ich dir nicht erklären, aber ich hoffe die Konfusion betreffs des Begriffs Prototyp ist wenigstens geklärt.



  • Wieder was dazugelernt.
    Mit dem "void"-Parameter gibt's keine Warning mehr.
    Thx


Anmelden zum Antworten