Was ist der Unterschied zwischen statischer Inline-, externer Inline- und einer normalen Inline-Funktion?

Lesezeit: 3 Minuten

Für immer der Benutzeravatar eines Noobs
Für immer ein Noob

Was ist der Unterschied zwischen a static inline, extern inline und ein normales inline Funktion?

Ich habe einige vage Erklärungen dazu gesehen. Soweit ich verstanden habe, static inline ist nicht nur ein inline Funktion, die nur innerhalb einer bestimmten Datei als bezeichnet werden soll static Schlüsselwort bedeutet normalerweise. Das gleiche gilt für extern inline Auch ich denke, es ist nicht die gleiche Erklärung wie mit extern Variablen. Alle Antworten würden sehr geschätzt!

  • mögliches Duplikat: stackoverflow.com/questions/7762731/…

    Benutzer1551592

    28. Juli 2014 um 17:13 Uhr

  • alle sind Inline-Funktionen. static inline ist wo eine statische Funktion ist, extern inline ist eine extern deklarierte Funktion, normal inline ist einfach normal.

    – MAKZ

    28. Juli 2014 um 17:14 Uhr

  • mögliches Duplikat: stackoverflow.com/questions/216510/extern-inline

    – Hsi-Hung Shih

    28. Juli 2014 um 17:15 Uhr

  • Lesen Sie auch stackoverflow.com/a/7767858/2204022

    – MAKZ

    28. Juli 2014 um 17:15 Uhr

  • Mögliches Duplikat von extern inline

    – o11c

    8. Juli 2018 um 6:43 Uhr

AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

Eine Funktionsdefinition mit static inline definiert eine Inline-Funktion mit interner Verknüpfung. Eine solche Funktion funktioniert “wie erwartet” von den “üblichen” Eigenschaften dieser Qualifizierer: static gibt es interne Verknüpfung und inline macht es inline. Diese Funktion ist also “lokal” für eine Übersetzungseinheit und darin eingebettet.

Eine Funktionsdefinition mit just inline definiert eine Inline-Funktion mit externer Verknüpfung. Eine solche Definition wird jedoch als bezeichnet Inline-Definition und es funktioniert nicht so externe Definition für diese Funktion. Das bedeutet, dass diese Funktion, obwohl sie eine externe Verknüpfung hat, als solche angesehen wird nicht definiert aus anderen Übersetzungseinheiten, es sei denn, Sie geben eine separate an externe Definition dafür irgendwo.

Eine Funktionsdefinition mit extern inline definiert eine Inline-Funktion mit externer Verknüpfung und gleichzeitig dient diese Definition als externe Definition für diese Funktion. Es ist möglich, eine solche Funktion von anderen Übersetzungseinheiten aufzurufen.

Die letzten beiden Absätze bedeuten, dass Sie die Wahl haben, eine Single bereitzustellen extern inline Definition für eine Inline-Funktion mit externer Verknüpfung oder Bereitstellung von zwei separaten Definitionen dafür: eine inline und andere extern. Im letzteren Fall darf der Compiler beim Aufruf der Funktion eine der beiden Definitionen auswählen.

  • Zur Klarstellung Ihres letzten Absatzes: Um die beiden separaten Definitionen bereitzustellen, ist es nicht erforderlich (und tatsächlich nicht ratsam), zwei Funktionskörper bereitzustellen. Stattdessen extern inline void f();die wie eine Deklaration aussieht (und ist), hat den Effekt, eine frühere zu transformieren inline void f() { ..... } eine externe Definition anstelle einer Inline-Definition für diese Einheit sein. (Ref. C11 6.7.4/7).

    – MM

    29. Juni 2015 um 7:04 Uhr

  • Wenn ich diese Antwort lese, habe ich Probleme, die genaue Bedeutung von “externer Definition” und “interner Definition” zu verstehen. Wo finde ich mehr dazu?

    – lernenlernenlernen

    7. April 2019 um 14:19 Uhr

  • “oder Bereitstellung von zwei getrennten Definitionen” inline int il_fun0(void) { return 0; } extern int il_fun0(void) { return 0; } führt zu einem C11-Kompilierungsfehler von “error: redefinition of ‘il_fun0′” (mit oder ohne die extern). `

    – chux – Wiedereinsetzung von Monica

    9. Dezember 2020 um 16:41 Uhr


  • @learnlearnlearn Die Inline-Definition wird für das Inlining von Funktionen verwendet. Die externe Definition wird wie gewohnt für den Funktionsaufruf verwendet. Das inline Das Schlüsselwort ist nur ein Hinweis für den Compiler, sodass Sie nicht sicher sein können, ob Ihr Funktionsaufruf für den Inlining- oder den normalen Aufruf kompiliert wird. Als Ergebnis sollten wir zwei Definitionen für dieselbe Inline-Funktion vorbereiten. Jede Übersetzungseinheit, die die Inline-Funktion aufruft, muss ihre eigene Inline-Definition haben, damit sie Inlining handhaben kann. Außerdem muss nur eine Übersetzungseinheit eine externe Definition haben, um einen normalen Anruf zu handhaben.

    – rosshjb

    26. Januar 2021 um 3:24 Uhr


  • @learnlearnlearn Wenn Sie beispielsweise die Optimierungsoption Ihres Compilers deaktivieren, wird der Inline-Funktionsaufruf zum normalen Funktionsaufruf kompiliert. In diesem Fall beziehen sich alle normalen Aufrufe nur auf eine gleiche externe Definition. Wenn Sie dagegen die Optimierungsoption aktivieren, wird der Inline-Funktionsaufruf in Inlining kompiliert. In diesem Fall wird das Inlining durch die eigene Inline-Definition jeder Übersetzungseinheit erreicht. Also setzen wir inline void func(void) {} in Header-Datei für Inlining und Put extern inline void func(void); in Quelldatei (separate Übersetzungseinheit) für normalen Aufruf.

    – rosshjb

    26. Januar 2021 um 3:25 Uhr


1398420cookie-checkWas ist der Unterschied zwischen statischer Inline-, externer Inline- und einer normalen Inline-Funktion?

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

Privacy policy