C: Zeiger auf Inline-Funktion

Lesezeit: 4 Minuten

Ich habe ein static inline Funktion, die in einer H-Datei definiert ist, und an einer Stelle in einer C-Datei weise ich der Funktion einen Zeiger zu, etwa so:

foo.h:

static inline void frobnicate(void) {
    // frobs something.
}

foo.c

#include "foo.h"

void execute(void (*func)(void) ) {
    func();
}

void blahBlahBlah(void) {
    execute(frobnicate);
}

bar.c

#include "foo.h"
// ...
frobnicate();

Ich denke also, was hier passieren wird, ist, dass der Compiler den Aufruf inline einfügt frobnicate von bar.c, aber in foo.c muss tatsächlich eine zu implementierende Funktion erstellt werden frobnicatedamit es einen funktionierenden Zeiger darauf haben kann.

Kann jemand bestätigen, ob mein Verständnis korrekt ist, und mich ansonsten korrigieren?

  • Du kann es bestätigen, indem Sie den generierten Code lesen. Ich glaube nicht, dass es einen bestimmten Weg gibt, wie das geht hat arbeiten. Ich wäre nicht überrascht, wenn der Compiler sagen würde: “Jemand möchte die Adresse davon, also lasst es uns dann nicht einbetten”.

    – abschalten

    16. Januar 2012 um 20:10 Uhr

  • Erinnere dich daran inline ist nur ein Anregung zum Compiler

    – Seth Carnegie

    16. Januar 2012 um 20:10 Uhr

  • Es kann auch darauf schließen, dass es einfach direkt inline sein könnte frobnicate hinein blahBlahBlah und überspringe die Zwischenhändler. Kein Hinweis auf frobnicate wird so gespeichert, dass es von einer anderen Übersetzungseinheit verwendet werden kann frobnicate muss nicht in der Assembly-Ausgabe vorhanden sein.

    – PSkočik

    4. Dezember 2018 um 19:07 Uhr


inline ist eine der Fehlbezeichnungen des C-Standards. Seine Hauptbedeutung besteht darin, die Definition einer Funktion in einer Header-Datei unterbringen zu können, ohne sich beim Linken mit Problemen der “Mehrfachdefinition” befassen zu müssen.

Der offizielle Weg in C99 und C11, das zu erreichen, was Sie erreichen wollen, ist, das zu haben inline Definition in der Header-Datei, ohne die static. Da Sie auch das auszugebende Symbol benötigen, müssen Sie dem Compiler mitteilen, in welcher Kompilationseinheit dieses liegen soll. Eine solche Instanziierung kann mit have a erfolgen Erklärung in dieser .c-Datei, in der Sie die weglassen inline Stichwort.

Am natürlichsten könnten Sie die .c-Datei dort verwenden, wo Sie das Symbol tatsächlich benötigen.

  • Wenn sich die Inline-Definition in der Header-Datei ohne staticwürde ich dann nicht mehrere Definitionen mit demselben Namen (die Inline-Funktion) haben, wenn ich versuche, zu verlinken?

    – Brianmearns

    16. Januar 2012 um 20:29 Uhr


  • Sie werden Verbindungsprobleme haben. Entweder schaffe es static inline, und riskieren Sie mehrere Definitionen oder geben Sie Inline auf. Sie können auch einen Wrapper erstellen, der sich in einer C-Datei befindet und nicht inline ist, und einen Zeiger darauf nehmen (kein Leistungseinbruch, da die eigentliche Funktion in den Wrapper eingebettet wird).

    – ugoren

    16. Januar 2012 um 21:38 Uhr

  • @bmearns, mit einem C99-kompatiblen Compiler haben Sie kein Verknüpfungsproblem. Genau das ist der Sinn der inline Stichwort. gustedt.wordpress.com/2010/11/29/…

    – Jens Gustedt

    17. Januar 2012 um 10:48 Uhr


  • @Jens: Danke, dieser Link hat es ziemlich verdeutlicht. Mir ist nicht ganz klar, wie der Compiler damit umgeht, aber ich glaube, ich verstehe, wie man es anwendet.

    – Brianmearns

    17. Januar 2012 um 12:23 Uhr

Ja, du hast recht. Wenn Sie den Zeiger auf die Funktion nehmen, muss der Compiler eine “eigenständige” Version erstellen, in der der Code als normale Funktion aufgerufen werden kann.

Der Vorteil des Inlinens einer Funktion besteht darin, dass der aufrufende Code nicht erstellt werden muss und jede andere Optimierung angewendet werden kann, um sowohl die Aufruferfunktion als auch die Inlinefunktion zu integrieren. Wenn Sie die Funktion jedoch regelmäßig aufrufen müssen (z. B. wenn Sie die Adresse verwenden, um sie später aufzurufen), sind diese Optimierungen nicht mehr möglich.

  • Dies mag für viele Compiler zutreffen, aber ich kann mir nicht vorstellen, warum ein Compiler dazu erforderlich wäre. Das Beispiel des OP könnte auch im Fall des Funktionszeigers ganz einfach inline eingebunden werden.

    Benutzer180326

    16. Januar 2012 um 20:31 Uhr

  • inline ist eine Empfehlung. Wenn der Compiler nicht inline kann, wird er es nicht tun, und wenn er es nicht kann, entscheidet er sich möglicherweise trotzdem dagegen (und er kann sogar ohne die inline Stichwort). Funktionszeiger verhindern im Allgemeinen Inlining, obwohl der Compiler in diesem Fall feststellen kann, dass dies nicht der Fall ist (oder es möglicherweise nicht stört).

    – ugoren

    16. Januar 2012 um 21:35 Uhr

  • Ja, in diesem Fall wäre es möglich, die Funktion zu inlinen. Ich nahm an, dass dies eine vereinfachte Version des Problems war. Aber Sie haben Recht.

    – Regierung

    17. Januar 2012 um 13:06 Uhr

1443620cookie-checkC: Zeiger auf Inline-Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy