Forum: Compiler & IDEs Funktionen überschreiben


von 0undNichtig (Gast)


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?

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


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
1
printf("Hello, world!\n");

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

ersetzen.

von 0undNichtig (Gast)


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?

von Uhu U. (uhu)


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

von 0undNichtig (Gast)


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 :-)

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


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.

von Rolf Magnus (Gast)


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.

von 0undNichtig (Gast)


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?

von 0undNichtig (Gast)


Lesenswert?

Eine andere Lösungsmöglichkeit kennt keiner?

von Uhu U. (uhu)


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

von 0undNichtig (Gast)


Lesenswert?

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

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.