30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

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.

448 13. Templates<br />

Executable dazugel<strong>in</strong>kt wird. Das Problem hierbei ist, dass sich der Compiler<br />

für jede e<strong>in</strong>zelne übersetzte Compilation Unit merken müsste, welche<br />

konkreten Ausprägungen e<strong>in</strong>es Templates er jetzt braucht. Nachdem er auf<br />

diese Art alle Files übersetzt hat, müsste er die Liste der gebrauchten Ausprägungen<br />

nehmen. Mit Hilfe dieser Liste müsste er die Compilation Unit<br />

übersetzen, welche die entsprechenden Def<strong>in</strong>itionen enthält, damit er auch<br />

wirklich den gesamten benötigten Code erzeugt. Leider tut das der Compiler<br />

nicht und es gibt auch ke<strong>in</strong>en vorgegebenen Weg im Standard, wie er<br />

das tun sollte. Das bedeutet, dass wir die Geschichte mit dem Aufteilen <strong>in</strong><br />

Deklarationen und Def<strong>in</strong>itionen im Pr<strong>in</strong>zip vergessen können.<br />

Es gibt jedoch zum Glück auch e<strong>in</strong>e gute Nachricht: Im C ++ Standard ist<br />

e<strong>in</strong> Weg vorgegeben, wie der Compiler dafür sorgen kann und soll, dass nicht<br />

e<strong>in</strong> und dieselbe Ausprägung e<strong>in</strong>es Templates für jede e<strong>in</strong>zelne Compilation<br />

Unit immer wieder von Neuem gebaut wird und damit den Code unnötig<br />

aufbläst: Man kann Def<strong>in</strong>itionen mit dem Keyword export versehen. Der<br />

Compiler reagiert laut Standard, wenn er auf e<strong>in</strong>e gewünschte Ausprägung<br />

e<strong>in</strong>es Templates stößt folgendermaßen:<br />

1. Er sieht nach, ob es schon e<strong>in</strong>e zuvor erzeugte, exportierte Ausprägung<br />

<strong>in</strong> der Form gibt, wie sie gerade gebraucht wird.<br />

2. Wenn ja, wird sie e<strong>in</strong>fach verwendet.<br />

3. Wenn ne<strong>in</strong>, wird e<strong>in</strong>e neue erzeugt und für eventuellen späteren Gebrauch<br />

exportiert.<br />

Leider hat auch das e<strong>in</strong>en Haken: Nur ausgesprochen wenige Compiler beherrschen<br />

den Export und die Wiederverwendung von speziellen Ausprägungen<br />

außerhalb der Compilation Unit, <strong>in</strong> der sie erzeugt wurden :-(.<br />

Zum<strong>in</strong>dest aber ist die Existenz e<strong>in</strong>es Standard-Vorgehens e<strong>in</strong> gutes Zeichen,<br />

dass sich die Situation diesbezüglich bald zum Guten ändern könnte.<br />

Deshalb möchte ich für Templates die folgende Vorgehensweise anregen:<br />

• Man schreibt e<strong>in</strong>en Header, <strong>in</strong> dem nur die Deklarationen enthalten s<strong>in</strong>d.<br />

Das ist im Pr<strong>in</strong>zip der e<strong>in</strong>zige Teil, den Benutzer von Templates wirklich<br />

zu sehen bekommen sollen.<br />

• Man schreibt e<strong>in</strong> cpp File, <strong>in</strong> dem alle benötigten Def<strong>in</strong>itionen enthalten<br />

s<strong>in</strong>d. Hierbei ist jede Def<strong>in</strong>ition mit export zu versehen, <strong>in</strong> der Hoffnung,<br />

dass <strong>in</strong> Kürze die Compiler damit wirklich etwas anfangen können :-).<br />

• Man <strong>in</strong>kludiert dieses cpp File am Ende des Headers. Mir ist schon bewusst,<br />

dass sich nun bei vielen Lesern die Zehennägel aufrollen, denn e<strong>in</strong><br />

cpp File sollte man beim besten Willen nicht <strong>in</strong>kludieren. Alle Leser, die<br />

dies wirklich außerordentlich stört, können auch gerne e<strong>in</strong>e andere Extension,<br />

wie z.B. tcpp (für Template-cpp) oder die auch gebräuchliche Extension<br />

tcc verwenden. In persönlich bevorzuge die Methode, alles, was<br />

mit Templates zu tun hat, getrennt vom Rest der Headers und Sources, <strong>in</strong><br />

e<strong>in</strong>em eigenen Subdirectory zu halten und cpp zu verwenden.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!