9.21 »inline«-Funktionen
inline-Funktionen sind dem C++-Programmierer ja bereits wohlbekannt und stehen mit dem C99-Standard auch dem C-Programmierer zur Verfügung. Um eine Funktion als inline-Funktion zu präsentieren, muss nur das Schlüsselwort inline vorangestellt werden:
/* inliner.c */ #include <stdio.h> #include <stdlib.h> static inline void xchange(int *z1, int *z2) { int tmp; tmp = *z2; *z2 = *z1; *z1 = tmp; } static inline void print(int *z1, int *z2) { printf("%d :: %d\n", *z1, *z2); } int main(void) { int zahl1 = 123, zahl2 = 321; print(&zahl1, &zahl2); xchange(&zahl1, &zahl2); print(&zahl1, &zahl2); return EXIT_SUCCESS; }
inline-Funktionen stellen eine sinnvolle Alternative zu parametrisierten define-Makros da. Der Code einer inline-Funktion wird vom Compiler direkt an der Stelle eingefügt, wo der Aufruf stattfindet. Damit entfällt der Sprung in ein Unterprogramm. Das heißt, die Sicherung der Rücksprungadresse, der Sprung zur Funktion und nach der Ausführung der Sprung zurück zur gespeicherten Rücksprungadresse entfallen. Dadurch ist die Ausführung einer inline-Funktion genauso schnell, als würde der Code direkt an der Stelle eingefügt.
Die inline-Funktionen sollten aber möglichst klein gehalten werden. Werden zu viele Anweisungen verwendet, kann der Compiler das Schlüsselwort inline auch ignorieren und es als eine normale Funktion behandeln. Das Schlüsselwort inline ist nämlich für den Compiler nur ein Hinweis und kein Befehl. Wann der Compiler eine Funktion als inline behandelt und verwendet, entscheidet dieser selbst.
Dass im Listing die inline-Funktion mit dem Spezifizierer static deklariert wurde, liegt daran, dass die Definition einer inline-Funktion in der Übersetzungseinheit vorhanden sein muss, wo diese verwendet wird. Der Nachteil an der inline-Funktion, die mit static deklariert ist, ist, dass Sie hierbei keine veränderbaren Speicherobjekte mit statischer Lebensdauer verwenden können.
In der Praxis wird daher die Deklaration (!) einer inline-Funktion in eine externe Headerdatei ohne inline geschrieben und zusätzlich mit dem Schlüsselwort extern versehen, um so der kompletten Übersetzungseinheit zur Verfügung zu stehen, die diese Headerdatei inkludiert.
/* inline.h */ #ifndef INLINE_H #define INLINE_H extern void xchange(int *z1, int *z2); extern void print(int *z1, int *z2); #endif
Jetzt können Sie auch die inline-Funktionen wie gewöhnliche Funktionen verwenden:
/* inliner2.c */ #include <stdio.h> #include <stdlib.h> #include "inline.h" inline void xchange(int *z1, int *z2) { int tmp; tmp = *z2; *z2 = *z1; *z1 = tmp; } inline void print(int *z1, int *z2) { printf("%d :: %d\n", *z1, *z2); } int main(void) { int zahl1 = 123, zahl2 = 321; print(&zahl1, &zahl2); xchange(&zahl1, &zahl2); print(&zahl1, &zahl2); return EXIT_SUCCESS; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.