2016-05-12 6 views
1

Programmiersprache: CFührt die Inline-Funktion zur Erzeugung schwacher Symbole?

Bei unserer Arbeit haben wir ein Projekt, das eine Header-Datei sagt header1.h. Diese Datei enthält einige Funktionen, die als externer Bereich deklariert sind (via extern) und auch als Inline in derselben Header-Datei (header1.h) definiert sind.

Jetzt ist diese Datei an verschiedenen Stellen in verschiedenen C-Dateien enthalten. Mein Verständnis ist, dass es einen Fehler von mehreren Definitionen mit meiner Erfahrung in der Vergangenheit mit GCC produzieren wird, und das ist, was ich erwarte. Aber bei unserer Arbeit bekommen wir diese Fehler nicht. Der einzige Unterschied ist, dass wir einen anderen Compiler-Treiber verwenden.

Aus meiner bisherigen Erfahrung ist die beste Schätzung, die ich mache, dass die Symbole als schwache Symbole zum Zeitpunkt der Kompilierung generiert werden und Linker verwendet diese Informationen, um eine von ihnen zu wählen.

Können als Inline definierte Funktionen zu schwachen Symbolen führen? Ist es möglich, oder könnte es einen anderen Grund geben?

Auch wenn Inline zur Erstellung von schwachen Symbolen führen kann, würde es eine Funktion geben, um es aus- oder einzuschalten.

+0

Nein, schwache Symbole sind eine GNU-Erweiterung und nicht einmal in der Norm definiert, AFAIK. Inline-Funktionen haben spezielle Semantiken, die Sie hier in Stack Overflow nachschlagen können. – Downvoter

+0

@Downvoter Schwache Symbole sind Teil des [ELF-Standards] (https://en.wikipedia.org/wiki/Weak_symbol): * Ein schwaches Symbol kennzeichnet ein speziell mit Anmerkungen versehenes Symbol beim Verknüpfen von ausführbaren und verknüpfbaren Format (ELF) -Objektdateien . ... * –

+0

@AndrewHenle Natürlich meine ich den C-Standard, ich habe vergessen, das zu schreiben. Als Teil des ELF-Standards ist es keine GNU-spezifische Erweiterung, sondern macht es unabhängig vom Standard implementierungsdefiniert. – Downvoter

Antwort

1

Wenn eine Funktion inline ist, wird der gesamte Funktionsbody bei jeder Verwendung der Funktion kopiert (anstelle der normalen Assembler-Call/Return-Semantik).

(moderne Compiler verwenden Inline als Hinweis und das tatsächliche Ergebnis könnte nur eine statische Funktion, mit einer eindeutigen Kopie in jeder kompilierte Datei es verwendet wurde sein)

+0

Danke. Aber nur eine Frage, um klar zu sein, wenn Sie sagen, "das tatsächliche Ergebnis könnte nur eine statische Funktion sein" meinen Sie mit statischen Speicherklasse. Eine Funktion mit Definition wie inline void func1 (void) {} ​​wird dann durch static void func1 (void) {} ​​ersetzt. Meinst Du das ? – user3750952

+0

Ja. Bei allen statischen und Inline-Funktionen wählt der Compiler die beste Lösung aus und verwendet die Eingabe in der Quelle als Hinweis- und Optimierungsflags. Atleast modernste. –

Verwandte Themen