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