Warum unterbricht das Inlining meiner Accessoren meinen Code?

9

Ich habe ein merkwürdiges Problem, bei dem der Versuch, inline der Accessoren für meine "Person" -Klasse auszuführen, dazu führt, dass der Code nicht kompiliert werden kann.

Der folgende Code wird erfolgreich kompiliert und ausgeführt (Using Visual Studio 2012):

Person.h

%Vor%

Person.cpp

%Vor%

header_test.cpp

%Vor%

Wenn ich meine Accessoren so ändere, dass sie als inline definiert sind, funktioniert der Code.

Einfügen der Accessoren in Person.h

%Vor%

Einfügen der Accessoren in Person.cpp

%Vor%

Dies führt zu den folgenden Fehlern:

  

1 & gt; header_test.obj: Fehler LNK2019: nicht aufgelöstes externes Symbol "public: Klasse std :: basic_string, Klasse std :: allocator & gt; __thiscall Person :: Name (void) const" (? Name @ Person @@ QBE? AV? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Zuordner @ D @ 2 @@ std @@ XZ) referenziert in der Funktion _wmain

     

1 & gt; schwerer Fehler LNK1120: 1 nicht aufgelöste externe Daten

Gott, diese Fehlermeldung ist kryptisch ... Vielen Dank für all diese so nützlichen Informationen Microsoft / Visual Studio!

Ich weiß, dass das Schlüsselwort inline nur ein "Hinweis" für den Compiler ist und wahrscheinlich keinen wirklichen Wert hat, aber es sollte trotzdem den Code nicht brechen!

Warum passiert das?

    
tjwrona1992 25.11.2015, 16:27
quelle

2 Antworten

3

Ich bin kein Sprachanwalt, daher kann ich nicht sagen, ob das Verhalten des Compilers legitim ist oder nicht. Dennoch kann ich erklären, was passiert.

Wenn Sie Ihre Funktionen inline markieren, sind Sie nicht und weisen den Compiler darauf hin, dass diese Funktion inline eingebunden werden kann. Seit über 10 Jahren brauchen Compiler hier keinen Hinweis. Sie wissen, wann sie inline sind. Stattdessen geben Sie die Funktionsdefinition für jede Übersetzungseinheit an, in der sie enthalten ist. Diese Definition sollte verfügbar sein.

Sie haben gesagt, dass name() definition lokal für jede .cpp Datei sein sollte, aber Sie haben sie nicht für jede .cpp Datei verfügbar gemacht! Ich glaube immer noch, dass der Compiler hier eine Warnung geben könnte.

    
SergeyA 25.11.2015, 16:31
quelle
1

Sie müssen den Funktionskörper in der Kopfzeile definieren, wenn Sie das Schlüsselwort inline verwenden möchten. inline gibt auch mehr als nur einen Hinweis auf den Compiler: Es schließt mehr oder weniger die "one definition" -Regel * ab, bei der Funktionen nur einmal definiert werden.

Darüber hinaus, wenn Sie Klassenmember Funktionen innerhalb der Header definieren, ala

%Vor%

Sie erhalten standardmäßig "inline", daher gibt es keinen Grund, das Keyword auszufüllen: -)

* Technisch nicht, aber der Einfachheit halber kann man sich das so vorstellen. Siehe den Kommentar von SergeyA.

    
bstamour 25.11.2015 16:32
quelle