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
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.
Ich habs also static inline gemacht - funktioniert! Danke für die schnelle Problemlösung!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.