Das inline
-Modell in C99 ist ein bisschen anders als die meisten Leute denken und insbesondere anders als das von C ++
inline
ist nur ein Hinweis, dass der Compiler nicht über doppelt definierte Symbole klagen muss. Es garantiert nicht, dass eine Funktion inline ist, und auch nicht, dass ein Symbol generiert wird, wenn es benötigt wird. Um die Generierung eines Symbols zu erzwingen, müssen Sie eine Art Instanziierung nach der inline
-Definition hinzufügen:
Normalerweise würde die inline
-Definition in einer Header-Datei enthalten sein, die dann in mehreren .c-Dateien (Kompilierungseinheiten) enthalten ist. Und Sie hätten nur die obige Zeile in genau einer der Kompilierungseinheiten. Sie sehen wahrscheinlich nur das Problem, das Sie haben, weil Sie keine Optimierung für Ihren Compiler-Lauf verwenden.
Also, Ihr Anwendungsfall, den inline
in der .c Datei zu haben, macht nicht viel Sinn, besser verwenden Sie einfach static
dafür, sogar ein zusätzlicher inline
kauft Ihnen nicht viel.
C99 Inline-Semantik wird oft missverstanden. Der Spezifizierer inline
dient zwei Zwecken:
Erstens, als Compiler-Hinweis im Fall von static inline
und extern inline
-Deklarationen. Semantik bleibt unverändert, wenn Sie den Spezifizierer entfernen.
Zweitens, im Fall von rohe inline
(dh ohne static
oder extern
), um eine Inline-Definition als Alternative zu einer externen Definition bereitzustellen, die in einer anderen Übersetzungseinheit vorhanden sein muss. Wenn Sie das externe nicht bereitstellen, handelt es sich um ein undefiniertes Verhalten, das normalerweise als Verbindungsfehler angezeigt wird.
Dies ist besonders nützlich, wenn Sie eine Funktion in eine gemeinsame Bibliothek einfügen möchten, aber auch den Funktionskörper für die Optimierung verfügbar machen (z. B. Inlining oder Spezialisierung). Unter der Annahme eines ausreichend intelligenten Compilers können Sie so viele der Vorteile von C ++ - Vorlagen wiederherstellen, ohne durch Präprozessor-Rahmen springen zu müssen.
Beachten Sie, dass es etwas unordentlicher ist, als ich hier beschrieben habe, da eine nichtlineare externe Deklaration mit einem anderen Dateibereich den ersten Fall wie in Jens Antwort beschrieben auslöst, auch wenn die Definition selbst inline
statt extern inline
ist . Dies ist beabsichtigt, sodass Sie eine einzelne Inline-Definition in einer Headerdatei haben können, die Sie in die Quelldatei einfügen können, die die externe Datei bereitstellt, indem Sie eine einzelne Zeile für die externe Deklaration hinzufügen.