www.mikrocontroller.net

Forum: Compiler & IDEs Standard Funktion überschreiben


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
printf("Hello world!\n");
durch
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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.