07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 95<br />

(8.21)<br />

es eigentlich sein sollte; das Verbergen wird durch zusätzliche Kennzeichung erreicht. Ohne<br />

diese zusätzliche Kennzeichnung hat ein Name externe Bindung und ist daher öffentlich.<br />

In C++(neu) gilt es jedoch als missbilligt, Namen durch interne Bindung zu verbergen. Die<br />

neue und zu bevorzugende Vorgehensweise geschieht mit unbenannten Namensbereichen<br />

(8.23a). Das allgemeine Konzept der Namensbereiche wird in (8.23c) kurz erläutert.<br />

Um bei den Namen, die öffentlich sein sollen, nicht in sehr schwer handhabbare Konsistenzprobleme<br />

zu geraten, hat sich schon in C ein recht interessantes Konzept entwickelt,<br />

das auch in C ++ ausgiebig angewandt wird: die Abspaltung der Deklarationen von Namen<br />

mit externer Bindung in sog. Headerdateien. Diese Headerdateien werden dann mit Hilfe<br />

einer Include-Direktive in jede Programmdatei eingefügt, in der die dort erwähnten Namen<br />

in irgendeiner Weise auftreten, d. h. benutzt oder auch definiert werden. Eine genaue Auflistung,<br />

welche Bestandteile zu einer Header- und welche zu einer Programmdatei gehören,<br />

ist in (8.24) ausführlich beschrieben.<br />

Anm Eine Ausnahme bilden die Typdefinitionen, meist in Form von Klassendefinitionen (Kap. 9);<br />

hier erscheinen i. a. sogar die Definitionen in Headerdateien.<br />

Zwei ausführliche C ++-Beispielprogramme (8.25, 8.26) erläutern den Umgang mit mehreren<br />

Programmdateien.<br />

Die Besonderheiten beim Zusammenbinden von C- und C ++-Programmdateien sind in (8.27)<br />

zusammengestellt.<br />

(a) Um ein Zusammenspiel zwischen verschiedenen Übersetzungseinheiten zu erlauben, müssen<br />

dem Linker in den Objektdateien (d. h. kompilierten Dateien) zu verknüpfende Namen angegeben<br />

werden. Die Stellen, an denen Referenzen benötigt werden (z. B. ein Funktionsaufruf),<br />

werden durch den Linker verknüpft ( ” aufgelöst“) mit Referenzangeboten (z. B. eine Funktionsdefinition).<br />

Diese Namen, die der Linker in den Objektdateien erhält, unterliegen der<br />

sog. externen Bindung 〈external linkage〉. Zu den Begriffen Objektdatei oder Objektprogramm,<br />

Linker oder Binder s. (1.32).<br />

Dagegen haben Namen einer Übersetzungseinheit, die für den Linker versteckt sind, die sog.<br />

interne Bindung 〈internal linkage〉. Daher können Namen mit interner Bindung nie mit<br />

gleichlautenden Namen anderer Übersetzungseinheit kollidieren.<br />

Eine bessere Möglichkeit, Namen zu verbergen, wird in C++(neu) durch einen unbenannten<br />

Namensbereich 〈unnamed namespace〉 angeboten. Dieses wird im Folgenden normalerweise<br />

eingesetzt.<br />

(b) Beim Zusammenspiel mehrerer Übersetzungseinheiten sollte daher folgende Regel beachtet<br />

werden:<br />

• Namen sollten normalerweise verborgen sein (durch interne Bindung oder besser durch<br />

Einschluss in einen unbenannten Namensbereich), und zwar wegen der Übersichtlichkeit;<br />

dann gibt auch keine Namenskonflikte mit anderen Übersetzungseinheiten.<br />

• Nur wenn eine Kommunikation mit anderen Übersetzungseinheiten nötig ist, sollte die<br />

externe Bindung vergeben werden.<br />

Dieses sollte bei jedem Namen geprüft werden! Diese Regel unterstützt auch das Geheimnisprinzip<br />

(6.13c).<br />

(c) Beispiele: Namen von Funktionen, die in anderen Übersetzungseinheiten aufgerufen werden<br />

sollen, müssen externe Bindung erhalten. Dagegen sollten Funktionen, die für andere<br />

Funktionen der gleichen Übersetzungseinheit Serviceberechnungen durchführen, verborgen<br />

werden. Variable sollten (fast) immer verborgen sein!<br />

(d) In diesem Zusammenhang ist die Regel genau einer Definition 〈one definition rule<br />

(ODR)〉 wichtig: Zu externen Namen darf und muss genau eine Definition (Referenzangebot)<br />

gehören, alle anderen Übersetzungseinheiten dürfen nur Deklarationen dieses Namens<br />

haben. Die ODR gilt natürlich auch für interne Namen.<br />

↑↑ Erlaubt nach den Regeln von C ++/C ist es, dass ein Linker ggf. keine Groß-/Kleinschreibung<br />

unterscheidet oder auch nur eine gewisse Anzahl von Zeichen für einen Namen als<br />

unterscheidend erkennt. Diese Beschränkung trifft heutzutage selten zu.<br />

Bei deklarierten Funktionen kann auf eine Definition verzichtet werden, wenn sie nirgendwo<br />

aufgerufen werden (7.23 Anm3).

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!