Inline-Funktionsverknüpfung

Lesezeit: 3 Minuten

Ich kann das folgende Verhalten nicht verstehen: ein Header mit einigen grundlegenden Typen und ein anderer Header, in dem ich diese Typen in mehreren Funktionen verwende. Danach begann ich, Klassen basierend auf meinen definierten Typen und Funktionen zu konstruieren. Im Funktionskopf hinterlasse ich folgende Signatur:

void whateverFunction(parameters)

Der Linker weist darauf hin, dass es mehrere Definitionen von WhateverFunction gibt. Wenn Sie es jetzt ändern in:

inline void whateverFunction(parameters)

das Verknüpfungsproblem ist weg und alles lässt sich gut kompilieren und verknüpfen. Was ich über Inline weiß, ist, dass es jeden Funktionsaufruf durch seinen Code ersetzt, außer dass es ziemlich dunkel ist, also ist meine Frage:

Wie behandelt der Linker Inline-Funktionen in C++?

  • Siehe “Was ist/sind der/die Zweck(e) von Inline?” für die Details, insbesondere den Teil auf der Eine Definitionsregel.

    – Georg Fritzsche

    16. November 10 um 11:41 Uhr


Wenn die Funktion im Header nicht inline ist, dann ist die mehrfache Definition dieser Funktion (z. B. in mehreren Übersetzungseinheiten) ein Verstoß gegen die ODR-Regeln.

Inline-Funktionen haben standardmäßig eine externe Verknüpfung. Daher sind aufgrund der ODR-Regeln (siehe unten) solche Mehrfachdefinitionen (z. B. in mehreren Übersetzungseinheiten) in Ordnung:

$3.2/5- “Es kann mehr als eine Definition eines Klassentyps (Abschnitt 9), eines Aufzählungstyps (7.2), Inline-Funktion mit externer Verknüpfung
(7.1.2), Klassenvorlage (Abschnitt 14), nichtstatische Funktionsvorlage (14.5.6), statisches Datenmitglied einer Klassenvorlage (14.5.1.3), Mitgliedsfunktion einer Klassenvorlage (14.5.1.1), oder Vorlagenspezialisierung, für die einige Vorlagenparameter nicht angegeben sind (14.7, 14.5.5) in einem Programm, vorausgesetzt, dass jede Definition in einer anderen Übersetzungseinheit erscheint und vorausgesetzt, dass die Definitionen die folgenden Anforderungen erfüllen. Wenn eine solche Entität namens D in mehr als einer Übersetzungseinheit definiert ist, dann

— jede Definition von D muss aus derselben Folge von Token bestehen; und […]

Wie der Linker Inline-Funktionen behandelt, ist ziemlich ein Detail auf Implementierungsebene. Es genügt zu wissen, dass die Implementierung solche multiplen Definitionen innerhalb der Grenzen der ODR-Regeln akzeptiert

Beachten Sie, dass, wenn die Funktionsdeklaration im Header in „statisch inline….“ geändert wird, die Inline-Funktion explizit eine interne Verknüpfung hat und jede Übersetzungseinheit ihre eigene Kopie der statischen Inline-Funktion hat.

  • Inline-Funktionen haben standardmäßig eine externe Verknüpfung.: Ich finde diese Aussage irreführend. Inline-Code wird überhaupt nicht verlinkt, zumindest nicht unter dem Funktionsnamen. Siehe Marcelos Antwort.

    – Jarekczek

    30. November 12 um 13:32 Uhr


  • Auf modernen Compilern kann man sehen inline als Schlüsselwort, um eine Mehrfachdefinition zu ermöglichen, anstatt einen Hinweis zu optimieren. Der Compiler kann entscheiden, eine Inline-Funktion nicht zu inlinen, und der Linker kann eine beliebige aus allen Kompilierungseinheiten auswählen. Der Programmierer sollte sicherstellen, dass eine Inline-Funktion über Kompilierungseinheiten hinweg identisch ist. Andernfalls entsteht undefiniertes Verhalten.

    – jdh8

    21. Juli 14 um 08:21 Uhr

Inline Funktionsverknupfung
Marcelo Cantos

Der Linker sieht möglicherweise überhaupt keine Inline-Funktionen. Sie werden normalerweise direkt in den Code kompiliert, der sie aufruft (dh der Code wird anstelle eines Funktionsaufrufs verwendet).

Wenn der Compiler die Funktion nicht einbettet (da es sich lediglich um einen Hinweis handelt), bin ich mir nicht sicher, aber ich denke, der Compiler gibt sie als normale Nicht-Inline-Funktion aus und kommentiert sie irgendwie, sodass der Linker nur die erste Kopie auswählt es sieht und ignoriert die anderen.

Inline Funktionsverknupfung
Jean-Bernard Jansen

Die Inline maskiert nur das Problem. Mehrere Definitionen weisen irgendwo auf ein Problem hin.

Seien Sie vorsichtig, wie Sie Ihre Header verwenden. Vergessen Sie nicht: – << #ifndef HEADER_NAME / #define HEADER_NAME / #endif >> um Mehrfacheinschlüsse zu vermeiden. – Verwenden Sie keine indirekte Einbeziehung: Wenn Sie einen Typ in einer Datei verwenden, fügen Sie den entsprechenden Header hinzu, selbst wenn ein anderer Header in derselben Datei ihn enthält.

  • Sie können denselben Header aus zwei verschiedenen Übersetzungseinheiten einfügen, und der Wächter hilft Ihnen nicht weiter.

    – Gaetano Mendel

    5. Oktober 20 um 16:11 Uhr

.

815760cookie-checkInline-Funktionsverknüpfung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy