Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
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).