Forum: Compiler & IDEs Standard Funktion überschreiben


von Stefan (Gast)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Stefan (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.