Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 97<br />
Das Beispiel (8.26) zeigt diese Verwendung von static.<br />
Das Schlüsselwort static ist sehr schillernd, es hat (leider) verschiedene Bedeutungen. Es<br />
kann statische Speicherklasse bedeuten (8.12) oder auch interne Bindung. Um diese Doppelbedeutung<br />
nicht mehr zu unterstützen, sollte static nur noch in der Bedeutung statische<br />
Speicherklasse und nicht mehr in der Bedeutung interne Bindung benutzt werden. Das<br />
letztere gilt daher in C++(neu) als missbilligt (Str3/Kap. B.2.3). An dessen Stelle sollte man daher<br />
einen unbenannten Namensbereich (a) nehmen.<br />
(c) ↑↑ Namensbereiche C++(neu)<br />
Ein Namensbereich dient der logischen Gruppierung von Namen. Zur Vermeidung von Namenskonflikten<br />
und damit der ” globale“ Namensbereich (alle Namen mit externer Bindung über alle<br />
Programmdateien hinweg) nicht überfrachtet wird, kann man eine Gruppe von Namen in einem<br />
Namensbereich ablegen.<br />
40 NamensbereichDefinition namespace NamensbereichNameopt { 10 Deklaration0..n }<br />
Auf Namen eines Namensbereiches kann innerhalb des Bereichs direkt zugegriffen werden, außerhalb<br />
durch explizite Spezifizierung mit dem Operator :: Op1b<br />
NamensbereichName :: Bezeichner<br />
Statt der expliziten Spezifizierung können durch eine using-Direktive sämtliche Namen eines Namensbereiches<br />
zugreifbar gemacht werden, und zwar für den Geltungsbereich, in dem die Direktive<br />
steht. (Bei Namenskonflikten hat der Name des Geltungsbereichs Vorrang vor dem aus dem Namensbereich;<br />
hier hilft dann nur die explizite Spezifizierung.)<br />
UsingDirektive using namespace NamensbereichName ;<br />
Alle Namen der Standardbibliotheken sind neuerdings im Namensbereich std abgelegt, daher die<br />
Direktive ” using namespace std;“. Beim Compiler MS Visual C ++ 6.0 sind in den Headerdateien<br />
ohne .h diese Namen in std abgelegt, bei denen mit .h im globalen Namensraum.<br />
Wenn man NamensbereichName in der Namensbereichdefinition weglässt ( ” unbenannter Namensbereich“,<br />
s. (a)), setzt der Compiler einen eigenen eindeutigen Namensbereich-Namen ein, dazu<br />
eine UsingDirektive für diesen Namen des Namensbereichs. Da für den Programmierer dieser Name<br />
nicht bekannt ist, kann außerhalb der Programmeinheit auf darin deklarierte Namen nicht zugegriffen<br />
werden. Diese Eigenschaft wird entspr. (a) zum Verbergen von Namen benutzt.<br />
(8.24) Headerdateien<br />
(a) Es ist sehr sinnvoll, die Deklarationen für Namen mit externer Bindung von den zugehörigen<br />
Definitionen zu trennen: Headerdatei 〈header file〉 und Programmdatei 〈program file〉. Erstere<br />
hat meist die Dateinamenerweiterung .H oder .h, letztere meist die Erweiterung .CPP<br />
oder .cpp, auch .CXX oder .cxx.<br />
Der wichtigste Grund dafür ist die Konsistenz zwischen Deklaration und Definition: Da<br />
in der Praxis die Programme ” leben“, d. h. immer wieder verändert werden, kann bei einer<br />
Änderung des Namens oder der Signatur einer Funktion vergessen werden, die (ggf. an vielen<br />
Stellen vorhandenen) Deklarationen der neuen Definition anzupassen. Der Linker bemerkt<br />
solche Änderungen nicht immer, so dass sich sehr schwer handhabbare Fehler einschleichen<br />
können. Viel besser ist es daher – zudem auch verbunden mit wesentlich weniger Aufwand<br />
–, genau eine Deklaration in genau eine Headerdatei zu schreiben und diese Datei überall<br />
einzuschließen, wo die Deklaration benötigt wird. Sehr wichtig ist es dann, dass diese Headerdatei<br />
auch in die Programmdatei eingeschlossen wird, die die Definition enthält, damit<br />
der Compiler die Konsistenzprüfung durchführen kann!<br />
(b) Empfehlung:<br />
• Bei nur wenigen Programmdateien (Praxis: bis zu etwa fünf Dateien) genügt es meist,<br />
die Deklarationen aller Programmdateien in eine einzige Headerdatei zusammenzufassen<br />
und diese überall einzuschließen.<br />
• Sonst ist es üblich, je Programmdatei eine Headerdatei (gleicher Dateinamen, Erweiterung<br />
.H oder .h) zu erstellen; diese wird dann, wo nötig, eingeschlossen.<br />
• Manche Bestandteile einer Headerdatei (z. B. Klassendefinitionen (9.11)) dürfen nicht<br />
mehrfach in derselben Übersetzungseinheit eingeschlossen sein. Wenn jedoch eine Headerdatei<br />
eine andere einschließt (z. B. wegen benötigter Typendefinition), kann es leicht<br />
zu einem (indirekten) Doppeleinschluss kommen. Durch die Möglichkeiten der bedingten<br />
Kompilierung kann man jedoch leicht einen Include-Wächter einfügen; Näheres s.<br />
(5.75c) und die Beispiele (8.25a) und (9.31a).