extern inline
Ich verstehe, dass die "inline" selbst ist ein Vorschlag an den compiler, und an seinem Unterscheidungsvermögen und es kann oder kann nicht die inline-Funktion, und es wird auch produzieren linkable object-code.
Ich denke, dass die "static inline" das gleiche tut (kann oder kann nicht inline), aber nicht produzieren linkable Objekt-code als inline (da kein anderes Modul konnte (link).
Wo steht "extern inline" passen in das Bild?
Nehme ich das austauschen möchten, Präprozessor-Makros eine inline-Funktion und erfordert, dass diese Funktion bekommt eingebettet (z.B., weil es nutzt die __FILE__ und __LINE__ werden Makros, die beheben sollten, die der Anrufer aber nicht diese Funktion). Das heißt, ich möchte, um zu sehen, eine compiler-oder linker-Fehler im Fall, dass die Funktion nicht inlined. Hat "extern inline" tun? (Ich gehe davon aus, dass, wenn es nicht, es gibt keine Möglichkeit, dieses Verhalten zu erreichen andere als kleben mit einem makro.)
Gibt es Unterschiede zwischen C++ und C?
Gibt es Unterschiede zwischen verschiedenen compiler-Hersteller und-Versionen?
InformationsquelleAutor der Frage | 2008-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
in K&R-C oder C89, inline-war nicht Teil der Sprache. Viele Compiler implementiert als eine Erweiterung, aber es gab keine definierte Semantik in Bezug auf, wie es funktionierte. GCC war unter den ersten zu implementieren, inlining, und führte die
inline
static inline
undextern inline
Konstrukte; die meisten pre-C99-compiler in der Regel Folgen Sie seiner Führung.GNU89:
inline
: die Funktion inlined (es ist nur ein Tipp). Eine out-of-line-version ist immer ausgestoßen und nach außen sichtbar. Daher können Sie nur solche inline definiert, die in einer compilation-unit, und jeder andere muss es sehen, wie ein out-of-line-Funktion (oder erhalten Sie doppelte Symbole zur link-Zeit).extern inline
wird nicht erzeugen eine out-of-line-version, aber nennen könnte (die deshalb müssen Sie definieren, in einigen anderen compilation unit. Die eine-definition-Regel gilt auch, obwohl; die out-of-line-version muss derselbe code wie die inline, die hier angeboten werden, falls die compiler-Aufrufe, statt.static inline
wird nicht erzeugen eine nach außen sichtbare out-of-line-version, obwohl es möglicherweise generieren eine Datei statisch ist. Die eine-definition-Regel nicht gilt, da es nie eine emittierte externes symbol noch ein Aufruf.C99 (oder GNU99):
inline
: wie GNU89 "extern inline"; keine extern sichtbare Funktion abgegeben, aber man konnte angerufen werden und so muss existierenextern inline
: wie GNU89 "inline": äußerlich sichtbaren code emittiert wird, also höchstens einen Textbaustein verwenden können.static inline
: wie GNU89 "static inline". Dies ist der einzige tragbare zwischen gnu89-und c99 -C++:
Eine Funktion, die inline-überall werden müssen inline-überall, mit der gleichen definition. Der compiler/linker Sortieren, mehrere Instanzen des symbols. Es gibt keine definition von
static inline
oderextern inline
obwohl viele Compiler haben Sie (in der Regel nach der gnu89-Modell).InformationsquelleAutor der Antwort puetzk
Ich glaube, Sie missverstehen, __FILE__ und __LINE__, basierend auf dieser Aussage:
Gibt es mehrere Phasen der Zusammenstellung und Vorverarbeitung ist die erste. __FILE__ und __LINE__ ersetzt werden, während dieser phase. So durch die Zeit, die der compiler kann prüfen, die Funktion für die inlining-Sie wurden bereits ersetzt.
InformationsquelleAutor der Antwort Don Neufeld
Es klingt wie Sie versuchen, etwas zu schreiben wie:
und hoffen, dass Sie mit verschiedenen Werten gedruckt, jedes mal. Als Don sagt, wirst du nicht, da __FILE__ und __LINE__ sind umgesetzt durch den Präprozessor, aber inline wird implementiert, indem der compiler. Also, wo immer Sie Sie nennen printLocation aus, du wirst das gleiche Ergebnis erhalten.
Den nur Weise können Sie damit dies funktioniert, ist printLocation ein makro. (Ja, ich weiß...),
InformationsquelleAutor der Antwort Roddy
Die situation mit inline static inline und extern inline ist kompliziert, nicht zuletzt, weil gcc und C99 definieren, die leicht unterschiedliche Bedeutungen haben für Ihr Verhalten (und vermutlich C++). Finden Sie einige nützliche und detaillierte Informationen über das, was Sie tun, in C hier.
InformationsquelleAutor der Antwort Simon Howard
Makros sind Ihrer Wahl hier eher als die inline-Funktionen. Eine seltene Gelegenheit, Makros Herrschaft über inline-Funktionen. Versuchen Sie die folgende: ich schrieb dieses "MACRO MAGIC" - code und es sollte funktionieren! Getestet auf gcc/g++ Ubuntu 10.04
Für mehrere Dateien definieren Sie diese Makros in einer separaten header-Datei mit der gleichen in jeder c/cc/cxx/cpp-Dateien. Bitte lieber inline-Funktionen oder const-Bezeichner (wie der Fall erfordert) über Makros, wo immer möglich.
InformationsquelleAutor der Antwort enthusiasticgeek
Statt zu Antworten "was tut es?", Ich bin der Beantwortung von "wie kann ich das machen lassen, was ich will?" Es gibt 5 Arten von inlining, alle erhältlich in GNU C89, C99-standard und C++:
immer inline, es sei denn, die Adresse ist genommen
Hinzufügen
__attribute__((always_inline))
um eine Erklärung, dann verwenden Sie eine derunter den Fällen zu behandeln, die Möglichkeit, die Adresse genommen wird.
Sollten Sie wohl nie benutzen, es sei denn, Sie müssen Ihre Semantik (z.B. Auswirkungen auf die Baugruppe in einer bestimmten Weise zu nutzen oder auf lizenzfreie
alloca
). Der compiler in der Regel besser weiß als Sie, ob es sich lohnt.inline und emittieren ein schwaches symbol (wie C++, auch bekannt als "just make it work")
Beachten Sie, dass diese Blätter eine Reihe von Kopien der gleichen code herumliegen, und der linker wählt einen willkürlich.
inline, aber nie emittieren jedes symbol (ohne externe Referenzen)
emittieren immer (für eine TU, die zur Auflösung des vorhergehenden)
Angedeutet, die version strahlt ein schwaches symbol in C++, aber ein starkes symbol in einem Dialekt von C:
Oder Sie können es tun, ohne den Hinweis, strahlt ein starkes symbol in beiden Sprachen:
In der Regel, Sie wissen, welche Sprache Ihre TU ist, wenn Sie die Bereitstellung der Definitionen, und wahrscheinlich nicht viel inlining.
inline und emittieren in alle TU
Für alle diese außer der
static
ein, können Sie einvoid foo(void)
Erklärung oben. Dies hilft mit "best practice" zu schreiben, saubere Header, dann#include
ing eine separate Datei mit der inline-Definitionen. Dann, wenn der Verwendung von C-Stil-inlines,#define
einige makro-anders als in einem dedizierten TU um die out-of-line-Definitionen.Vergessen Sie nicht
extern "C"
wenn der header kann verwendet werden, sowohl aus C und C++!InformationsquelleAutor der Antwort o11c