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 frobnicate
damit es einen funktionierenden Zeiger darauf haben kann.
Kann jemand bestätigen, ob mein Verständnis korrekt ist, und mich ansonsten korrigieren?
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.
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.
14436200cookie-checkC: Zeiger auf Inline-Funktionyes
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
hineinblahBlahBlah
und überspringe die Zwischenhändler. Kein Hinweis auffrobnicate
wird so gespeichert, dass es von einer anderen Übersetzungseinheit verwendet werden kannfrobnicate
muss nicht in der Assembly-Ausgabe vorhanden sein.– PSkočik
4. Dezember 2018 um 19:07 Uhr