2009-09-14 10 views
13

Warum bekomme ich diese Warnung in Qt Creator: `Inline-Funktion 'bool Lion :: growl()' verwendet, aber nie definiert?Qt Creator: "Inline-Funktion verwendet, aber nie definiert" - warum?

ich meinen Code doppelt geprüft und haben eine Erklärung

inline bool growl() in Lion (lion.h)

und die entsprechende Umsetzung in lion.cpp:

inline bool Lion::growl()

Was ist los?

EDIT: Meine Annahme war, dass es legal ist, die tatsächliche Inline-Methode in der .cpp-Datei zu definieren (das inline Schlüsselwort warnt den Compiler nach der Methode Körper woanders), oder irre ich mich?

Ich möchte nicht meine Header-Dateien mit Implementierungsdetails zu verstopfen.

+0

Randbemerkung: Was ich gelernt habe, dass Inline-Funktionen in der Header-Datei (oder in einer separaten Inl-Datei, die am unteren Rand einer Kopfzeile enthalten ist) implementiert sind. – RvdK

Antwort

26

Nun, ich weiß nicht, das genaue Problem, aber für den Anfang:

  • Inline Methoden sollen in der Header-Datei implementiert werden. Der Compiler muss den Code zu inline es tatsächlich kennen.
  • Auch die Verwendung des Schlüsselworts "inline" in der Klassendeklaration hat keine Auswirkungen. Aber es kann auch nicht weh tun.

Siehe auch: c++ faq lite

+3

Persönlich (und das ist Geschmackssache), ich * hasse * Code, der Code explizit als Inline markiert - entweder mit dem Inline-Schlüsselwort oder indem die Implementierung aus zwei Gründen in die Header-Datei gesetzt wird: 1) bricht die Kapselung ab. 2) es schmerzt Leistung - ja, du hast mich gehört. Wer glaubt, dass man wissen muss, ob ein Mathod in eine Performance-Steigerung einfließen wird: den Compiler oder den Programmierer. Ernsthafte Leute, vertraue deinen Optimierern, sie machen einen besseren Job (in vielen Fällen, aber nicht alle), dann wirst du es jemals tun. – Thomi

+7

@Thomi Wenn ich nur eine 1-Zeilen-Wrapper um eine Funktion erstellen, bin ich mir ziemlich sicher, dass es besser ist, inline zu sein. –

+0

Microsoft sagt, dass sie durch das Erzwingen dieser Regel die Linkzeiten und die Größenreduktion in statischen Bibliotheken erheblich steigern können: http://blogs.msdn.com/b/vcblog/archive/2014/09/26/feedback- make-zc-inline-default-für-debug-release-configs-in-14.aspx – bames53

1

Zusätzlich zu dem, was Johan sagte, man kann nicht eine gesonderte Definition und Erklärung für die Funktion hat, auch wenn beide in der gleichen Header-Datei sind. Dies gilt insbesondere für Elementfunktionen von Klassen. Der Funktionscode sollte die folgende Form haben:

class someClass 
{ 
void someFunc() 
{ ... } 
} 
// This will make the function inline even w/o the explicit 'inline' 

und nicht von der Form

class someClass 
{ 
public: 
    void someFunc(); 
} 

void someClass::someFunc() 
{ ... } 
+0

Sie können tatsächlich eine separate Definition und Deklaration haben: 'Klasse C {inline void f(); }; void C :: f() {} '. Sie müssen nur explizite "Inline" statt implizit verwenden. – bames53

3

Inline Methoden sollen in der Header-Datei implementiert werden. Der Compiler muss den Code kennen, um ihn tatsächlich zu inline zu schreiben.

Außer wenn die Inline-Funktion im gleichen Projekt verwendet wird, möglicherweise in einer anderen Datei, dass # include sein Header.

Ich vermisse es gibt eine solche Beschränkung für Bibliotheken, weil die Beschränkung Header auf Prototypen funktionieren Dinge lesbarer machen.

Wie wäre es mit #include -ing die .cpp?

+0

C++ erfordert "Eine Inline-Funktion muss in jeder Übersetzungseinheit definiert sein, in der sie verwendet wird." _n3337 basic.def.odr/3_ Das bedeutet im Wesentlichen, dass wenn eine Inline-Funktion in einem Header deklariert ist, diese auch in der Kopfzeile definiert sein sollte. – bames53

Verwandte Themen