07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!