extern inline - multiple definition error nach compilerupdate

OP #1057592
Hallo,

ich habe C-Funktionen in Headerfiles als "extern inline" definiert. Nun 
meckert der Linker: "multiple definition of ...", weil die Funktionen 
von mehreren C-Files aus aufgerufen werden, die Funktionen also mehrfach 
(aber doch nur inline!?) eingefügt werden.

Jedoch: dieses Problem hab ich erst seit einer neuen Compilerversion, 
die ich im Zuge eine Neuinstallation installiert habe:

Ich verwende AVRStudio mit folgender Umgebung:
WinAvr, Release 20080610, darin
GNU Compiler Collection (GCC) 4.3.0 (laut WinAvr Manual).

Vorher, also wies noch keine Fehlermeldungen gab, verwendete ich
WinAvr, Release 20070525, darin
GCC 4.1.2 (laut WinAvr Manual).


Folgende Compileroptionen:
-Wall -gdwarf-2 -std=gnu99  -Winline  -O2 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT


Das Headerfile schaut in etwa so aus:

void function1();

extern inline void function1()
{
...
}



Was stimmt daran nicht, oder nicht mehr?

lg
Johngo
Moderator Persönliche Seite #1057595
John Go wrote:

> ich habe C-Funktionen in Headerfiles als "extern inline" definiert.

Don't do it.

> Nun
> meckert der Linker: "multiple definition of ...", weil die Funktionen
> von mehreren C-Files aus aufgerufen werden, die Funktionen also mehrfach
> (aber doch nur inline!?) eingefügt werden.

Wofür denn aber das "extern", wenn du sie inline haben willst?

Das passt eigentlich nicht wirklich zusammen.  Der einzige Grund
dafür ist, dass man an der Stelle, wo sie außer "inline" auch noch
"extern" ist eine Implementierung der Funktion erhält, die sich für
Externaufrufe eignet (bspw. um davon einen Zeiger zu bilden).

> Jedoch: dieses Problem hab ich erst seit einer neuen Compilerversion,
> die ich im Zuge eine Neuinstallation installiert habe:

Weil der GCC früher seine recht private Idee davon hatte (er kannte
inline-Funktionen schon lange vor dem C-Standard), wie diese beiden
Anforderungen unter einen Hut zu bekommen seien.  Mittlerweile
hat er aber umgeschaltet auf die von C99 vorgeschriebene Variante.

> Was stimmt daran nicht, oder nicht mehr?

Ja, mach die Teile "static inline", wenn du sie wirklich alle inline
bekommen willst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.