Hallo, wie kann ich Funktionen aus den Standardbibliotheken überschreiben? Hintergrund: ich möchte gerne printf durch eine kleinere Variante ersetzen, die allerdings die gleiche Signatur wie das Original hat. Dabei möchte ich dass die aufrufenden Module trotzdem nur die <stdio.h> includen müssen. Geht sowas?
> wie kann ich Funktionen aus den Standardbibliotheken überschreiben?
Gar nicht. Der C-Standard verbietet dies ausdrücklich. Auf diese
Weise wird es dem Compiler ermöglicht, dass er mit ,,Insiderwissen''
über die Standardbibliothek spezielle Optimierungen ausführen darf.
So ersetzt der GCC beispielsweise:
1 | printf("Hello world!\n"); |
durch
1 | puts("Hello world!"); |
Für die avr-libc kann ich dir aber sagen, dass du die Funktion vfprintf() durch eine Eigenimplementierung ersetzen musst und sicher stellen musst, dass diese auch gelinkt wird (dafür dient das -Wl,-uvfprintf). Natürlich müsste die vfprintf-Funktion alle Parameter der avr-libc-internen akzeptieren, insbesondere müsste sie, falls du irgendeine der _P-Varianten benutzt, mit dem Formatstring im ROM umgehen können. Die Details kannst du dir ja einfach in der Originalimplementierung ansehen.
Ich dachte bisher, dass die Standardbibliothek eine ganz normale Bibliothek ist, von deren existenz der gcc gar nichts weiss. Es muss doch zum Beispiel auch möglich sein ein putchar() oder ähnliches zu überschreiben, wenn ich nicht auf der Konsole sondern auf ein Display ausgeben möchte. Ansonsten bleibt mir nur, mein eigenes printf umzubenennen und alle aufrufe so wie deren includes auch zu ändern?
Nochaml konkreter: Ich Entwickel für einen Arm und hier gibt es die newlib. Wenn ich printf aus der newlib nutze, werden aber immer malloc und co einkompiliert die eine erhebliche Menge an Ram und Flash verbrauchen. Daher habe ich ein eigenes printf gebastelt, was ohne malloc auskommt.
Stefan wrote: > Ich dachte bisher, dass die Standardbibliothek eine ganz normale > Bibliothek ist, von deren existenz der gcc gar nichts weiss. Dann dachtest du falsch. > Es muss > doch zum Beispiel auch möglich sein ein putchar() oder ähnliches zu > überschreiben, wenn ich nicht auf der Konsole sondern auf ein Display > ausgeben möchte. Nein, muss es nicht. Das kann ein möglicher Weg sein, falls eine konkrete Implementierung das so dokumentiert. Aber wer sagt dir, dass die tatsächliche printf-Implementierung denn wirklich putchar() nimmt? In der avr-libc beispielsweise würde dieser Weg nicht funktionieren. Dort ist allerdings ein anderer Weg dokumentiert, wie man die Ausgabe von stdio für seine eigenen Backends anpassen kann. > Ansonsten bleibt mir nur, mein eigenes printf umzubenennen und alle > aufrufe so wie deren includes auch zu ändern? Meiner Meinung nach (habe ich aber nicht gegen den Standard verifiziert) ist es zulässig, dass du printf mit einem Makro überschreibst, der natürlich erst definiert werden darf, nachdem <stdio.h> includiert worden ist. Was in jedem Falle geht, ist sowas wie my_printf() zu implementieren.
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.