Function Pointer



  • Hallo,
    bekomme Warnungen vom Compiler, wenn ich folgendes compiliere:

    void test(void);
    
    int main()
    {
    /* ... */
    
       void (*test_function)(void) = &test;
    
    /* ... */
    }
    
    void test()
    {
        printf("blub\n");
    }
    

    Die Warnungen:

    bufferoverflow-test.c:12:35: warning: initialization from incompatible pointer type [enabled by default]
    bufferoverflow-test.c:12:5: warning: ISO C90 forbids mixed declarations and code [-pedantic]
    

    Weiss jemand weiter?!

    Danke im Voraus.

    L. G.
    Steffo



  • Die erste Warnung kriegst du weg wenn du das & entfernst. Sag mir warum.

    Die zweite Warnung hat damit erstmal nichts zu tun, ich nehme an der erste Kommentar in main() enthält nicht nur Deklarationen sondern auch Code. Also entweder erst alle Deklarationen und dann Code, oder dem gcc noch -std=c99 mitgeben um ihn in den C99-Mode zu versetzen, denn C99 erlaubt "mixed declarations and code".



  • Tim schrieb:

    Die erste Warnung kriegst du weg wenn du das & entfernst. Sag mir warum.

    Das macht keinen Unterschied für den gcc. Das Eigentliche Problem war, dass ich eine Variable einen Wert zugewiesen habe und später dann eben den Funktionszeiger deklariert und initialisiert habe.
    Mich würde aber interessieren, weshalb da kein Adressoperator hinsoll. Bei Arrays ist das klar, da der Name des Arrays immer auf die Anfangsadresse zeigt. Bei Pointern ist es so, dass der Adressoperator die eigene Adresse meint, aber weshalb lässt man das bei Funktionsnamen weg? Der Compiler meckert wie gesagt nicht darüber, wenn ich den Adressoperator da lasse.

    L. G.
    Steffo



  • Steffo schrieb:

    und später dann eben den Funktionszeiger deklariert und initialisiert habe.

    Bei Deklarationen kann man nicht initialisieren, du meinst Definitionen.

    Steffo schrieb:

    Mich würde aber interessieren, weshalb da kein Adressoperator hinsoll.

    ... hin braucht ...
    Der Funktionsname ohne Adressoperator stellt einen Ausdruck vom Funktionstyp dar, der hier immer (implizit) in einen Zeiger auf diese Funktion umgewandelt wird.
    Ergebnis ist also "Zeiger auf Funktion".
    Mit Adressoperator stellt der Funktionsname den Operanden für den Operator dar und wird hier auch immer in einen Zeiger auf den Operanden (also diese Funktion) umgewandelt.
    Ergebnis ist also "Zeiger auf Funktion".
    Die beiden "Ergebnisse" sind gleich, deshalb warnt der Compiler nicht (wenn er nach ANSI C Standard arbeitet).

    Steffo schrieb:

    Bei Arrays ist das klar, da der Name des Arrays immer auf die Anfangsadresse zeigt.

    Ach wirklich immer?
    Da liegst du falsch.



  • Wutz schrieb:

    Steffo schrieb:

    Bei Arrays ist das klar, da der Name des Arrays immer auf die Anfangsadresse zeigt.

    Ach wirklich immer?
    Da liegst du falsch.

    Sondern? 😕



  • Kapitel 3.2.2.1 im ANSI C Standard und

    http://www.lysator.liu.se/c/c-faq/c-2.html

    wobei im Standard noch eine 4. Ausnahme genannt wird. (Die mir etwas spitzfindig erscheint ich aber trotzdem für einen Standard durchaus akzeptabel halte)


Anmelden zum Antworten