C99 Inline-Funktion in .c-Datei

24

Ich habe meine Funktion in .c (ohne Header-Deklaration) wie hier definiert:

%Vor%

Dann benutze ich es in der gleichen Datei unten:

%Vor%

Und während der Verlinkung bekam ich "undefinierten Bezug auf 'func'". Warum?

    
user14416 26.04.2013, 21:29
quelle

2 Antworten

32

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:

%Vor%

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.

    
Jens Gustedt 26.04.2013, 21:41
quelle
21

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.

    
Christoph 27.04.2013 16:56
quelle

Tags und Links