mikrocontroller.net

Forum: Compiler & IDEs Funktionen überschreiben


Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!
Ich habe mal ne Frage und zwar kann man durch irgendein Schlüsselwort 
unter C99 bereits implementierte Funktionen mit derselben Parameterliste 
überschreiben z.B. weil die neue Funtion effizienter arbeitet? Oder 
müsste man da die alte Funktion per Präprozessor ausblenden?

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

Bewertung
0 lesenswert
nicht lesenswert
Wie stellst du dir das vor?  Was ist ,,bereits implementiert''?

Eine Funktion aus einer Bibliothek wird nicht benutzt, wenn deine
eigenen Objekte bereits die Implementierung einer entsprechenden
Funktion liefern.  Aber: C99 verbietet ausdrücklich, dass man
Standardfunktionen selbst reimplementiert.  Der Hintergrund ist,
dass der Compiler auf diese Art implizites Wissen über die
Standardfunktionen besitzen darf und diese nach Belieben selbst
optimieren.  Beispielsweise kann er ein
printf("Hello, world!\n");

durch ein
puts("Hello, world!");

ersetzen.

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja also ich dachte mir, dass ich eine allgemeine Bibliothek schreibe, in 
die sich Treiber "einhängen" können indem sie einige Primitivfunktionen 
implementieren.
Da ich aber bisher schon den Fall hatte, dass auch einige "höhere" 
Funktionen dieser Bibliothek durch den Treiber besser optimiert weil auf 
die konkrete Hardware zugeschnitten, implementiert werden könnte, wollte 
ich das auch Treibern ermöglichen.
Bloß wie?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast merkwürdige Vorstellungen von "Treibern". In irgendwelche 
"allgemeine Bibliotheken" hängen die sich üblicherweise nicht ein.

http://de.wikipedia.org/wiki/Ger%C3%A4tetreiber

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neee also ich meinte das natürlich alles für den Mikrocontroller ^^ und 
eher auf die Modularisierung meiner eigenen Bibliothek. Nen es HAL oder 
so :-)

Bei OOP kann man durch OVERLOAD doch z.B. auch in einer abgeleiteten 
Klasse Funktionen einer Elternklasse überschreiben. Genau das will ich 
ja auch nur ebend in sequentieller Programmierung :-)

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

Bewertung
0 lesenswert
nicht lesenswert
Wie schon geschrieben: aus einer echten Bibliothek (also einer .a-Datei,
die mit avr-ar erstellt worden ist) werden nur die Objektmodule vom
Linker genommen, die zum Auflösen bis dato ungelöster externer
Referenzen beitragen.  Alles, was auf der Linker-Kommandozeile als
.o-Datei steht, wird dagegen immer gelinkt.  Damit werden aber dort
implementierte Funktionen gar nicht erst in einer Bibliothek gesucht.

Schließlich gibt's noch das Attribut "weak", das man für deinen Zweck
benutzen kann.  Das bewirkt, dass der Linker in einer Situation, in
der er normalerweise eine Doppeldefinition eines Symbols anmosern
würde (d. h. er hat bereits zwei Objektmodule in der Liste, die beide
das Symbol definieren) dies nicht tut und einem von beiden den Vorrang
gibt, wenn das andere von den beiden "weak" ist.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bei OOP kann man durch OVERLOAD doch z.B. auch in einer abgeleiteten
> Klasse Funktionen einer Elternklasse überschreiben.

Das hat aber auch nur dann einen Effekt, wenn du sie auf Objekte der 
abgeleiteten Klasse anwendest.

> Genau das will ich ja auch nur ebend in sequentieller
> Programmierung :-)

Die Funktionalität virtueller Memberfunktionen kann man über 
Funktionszeiger nachbilden.

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber dann wird das ja alles unnötig kompliziert, wäre da ein IFDEF 
nicht strukturierter und vorallem auch weniger fehleranfällig? Oder 
reden wir aneinander vorbei?

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine andere Lösungsmöglichkeit kennt keiner?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0undNichtig wrote:
> Ich habe mal ne Frage und zwar kann man durch irgendein Schlüsselwort
> unter C99 bereits implementierte Funktionen mit derselben Parameterliste
> überschreiben z.B. weil die neue Funtion effizienter arbeitet?

Auf Sprachebene geht das prinzipiell nicht, da Compiler, die sowas 
ermöglichen, aus dem Namensraum - z.B. der Klasse, in der eine Funktion 
definiert ist -, dem Funktionsnamen und der Parameterliste eine sog. 
Signatur bildet.

Signaturen müssen eindeutig auf eine Definition weisen, sonst 
funktioniert das nicht.

> Oder müsste man da die alte Funktion per Präprozessor ausblenden?

Ich kann dir leider nur einen bösen Hack bieten, mit dem man sowas 
hintrixen kann, muß aber gleichzeitg dringend davor warnen, ihn zu 
benutzen, weil man sich (und anderen) damit ganz böse ein Bein stellen 
kann und zudem die Benutzung von IDE-Funktionen zur Lokalisierung von 
Funktionen nicht mehr gehen und das Debuggen ist auch kein Vergnügen:

Angenommen, du willst puts irgendwoanders hin umbiegen. Dann includest 
du zuerst den Header, in dem puts deklariert ist. Dahinter schreibst du 
dann sowas wie

   #define puts(s)    my_puts(s)

Dann ersetzt der Preprozessor ab dieser Stelle alle Aufrufe von puts 
durch my_puts.

Dieser Trick funktioniert allerdings nur für Funktionen mit fester 
Parameter-Anzahl.

Eine noch fiesere Variante:

   #define puts      my_puts

Dann gehts auch mit Funktionen wie printf - aber wie gesagt: es ist ein 
tückischer Hack.

Visual C macht sowas, um den Debug-Heap zu aktivieren - ein ziemliches 
Ärgernis...

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja so in etwa dachte ich mir das, auch mit den Konsequenzen :-(

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.