Das inline
Attribut ist nur ein Hinweis an den Compiler, dass es versuchen sollte, Ihre Funktion zu inline. Es ist immer noch möglich, die Adresse der Funktion zu übernehmen, und in diesem Fall muss der Compiler auch eine Nicht-Inline-Version ausgeben.
Zum Beispiel:
#include <stdio.h>
inline void f() {
printf("hello\n");
}
int main() {
f();
void (*g)() = f;
g();
}
Der obige Code druckt hello
zweimal.
Mein gcc
Compiler (mit -O
) emittiert Code etwas wie folgt aus:
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
call ___i686.get_pc_thunk.bx
"L00000000002$pb":
leal LC0-"L00000000002$pb"(%ebx), %eax
movl %eax, (%esp)
call L_puts$stub ; inlined call to f()
call L__Z1fv$stub ; function pointer call to f() (g is optimised away)
movl $0, %eax
addl $20, %esp
popl %ebx
popl %ebp
ret
Wie Sie sehen können, gibt es zunächst ein Aufruf an puts()
und dann ein Aufruf an L__Z1fv()
(das ist der verstümmelten Namen f()
ist).
Ich denke, dass Satz mehr Kontext benötigt. "Inline-Funktion hat immer noch eine eindeutige Variable" macht keinen Sinn. Warum glauben Sie nicht, dass eine Inline-Funktion eine Adresse haben kann? –
Welche Ausgabe? Ich schaue mir die dritte Ausgabe an und kann nicht sehen, wo das steht. – Clifford
Präzise Zitat aus dem Buch - "Insbesondere eine Inline-Funktion hat immer noch eine eindeutige Adresse und so statische Variablen einer Inline-Funktion". Dies ist die letzte Sache in Abschnitt 7.1.1 - der vorherige Abschnitt beginnt mit "Der Inline-Spezifizierer ist ein * Hinweis * für den Compiler" (meine Hervorhebung). Statische Variablen sind in Abschnitt 7.1.2 behandelt. – Steve314