Kann eine in zwei separate CPP -Dateien definierte Inline -Funktion während der Verknüpfung doppelte Symbole erstellen?

StackOverflow https://stackoverflow.com/questions/19843380

Frage

Ich finde viele Ressourcen online, um wie inline (und sogar __attribute__((always_inline)) oder __forceinline) zwingt den Compiler (z. B. GCC oder Visualc ++) nicht zur Einführung der Funktion. Aber wann genau wird Inline nicht durchgesetzt? Gibt es ein Spielzeugbeispiel?

Vielleicht nicht unbedingt die gleiche Frage, wann wird eine Funktion mit getaggt inline In zwei verschiedenen CPP -Dateien enthaltene Probleme während der Verknüpfung? Nämlich doppelte Symbole erzeugen?

Hier ist eine konkrete Sandkiste zum Versuch, den Compiler zu brechen, der ein doppeltes Symbol erzeugt und erzeugt:

Im myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

Im aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

Im main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

Dann gibt es im Fall von GCC einen (minimalen) Code für einen (minimalen) Code für myinline Dies führt zu einem doppelten Symbol beim Kompilieren und Verknüpfen mit:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

War es hilfreich?

Lösung

"Inlining" und "doppelte Symbole" sind verschiedene Dinge. Das inline Die Schlüsselwörter ermöglichen explizit mehrere Definitionen (dh Sie befreit Sie von der Eindefinitionsregel), sodass die Plattform (Compiler und Linker) wissen muss, wie sie damit umgehen und dedupliziert werden.

(Dies geschieht die ganze Zeit für Klassenmitgliederfunktionen, die in den Headern definiert sind.)

Wenn Sie nur wollen Codegenerierung Um zu passieren, können Sie die Adresse der Funktion irgendwo speichern:

auto fp = my_inline;

Auf diese Weise muss der Compiler eine Definition der Funktion generieren, um ihm eine Adresse zu geben. Aber selbst wenn Sie dies in jeder Übersetzungseinheit tun, erhalten Sie keinen Linker -Fehler, da dies zum Zeitpunkt der Verknüpfung dedupliziert wird. Die Anforderung, dass alle Definitionen identisch sind, stellt sicher, dass dies gut definiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top