 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 20.05.2007, 15:21 Titel: |
|
|
hanse hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: | Trotzdem gibt es auch einige wenige Fälle in denen #defines möglich und anerkannt sind, wenn man sie richtig einsetzt; nur sind diese Fälle durch den Schritt c -> c++ stark eingeschränkt. Zwei solcher Fälle sind zum Beispiel [...] und die include-guards. |
was ist mit der Directive? |
Aber häufig unterstützt und z.T. sogar effizienter als include guards. Am besten einfach eine Kombination nutzen:
CPP: | #ifndef __FOOBAR_H_
#define __FOOBAR_H_
#if _MSC_VER > 1000
#pragma once
#endif
// Code
#endif
|
|
|
Nach oben |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 20.05.2007, 15:37 Titel: |
|
|
öhm.. wieso effizienter? |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 20.05.2007, 15:39 Titel: |
|
|
Dann ist das angesprochene Problem aber alles andere als gelöst, weil '#define' dadurch immer noch nicht hinfällig ist, ganz im Gegenteil...
Außerdem verkürzt '#pragma once' nur die Zeit, die zum Kompilieren benötigt wird (und nicht mal das zwangsläufig bei jeder Implementierung), was i.d.R. wurst ist. Spätestens wenn man intensiv "metaprogrammiert", kann man sich eh erstmal 'nen Kaffee kochen gehen, während der Compiler arbeitet. |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 20.05.2007, 15:43 Titel: |
|
|
Weil das inkludieren von Compilern welche die #pragma once Direktive unterstützen optimiert wird. Bei "normalen" Includeguards wird die Datei bei jeder Include Direktive geöffnet und der Präprozessor prüft ob die entsprechende Definition schon besteht. Residiert in einer Datei ein #pragma once so merkt sich der Compiler das und ignoriert alle weiteren include Direktiven welche die Datei einbinden wollen. D.h. es wird das öffnen der Datei und das überprüfen der Definition gespart was sich bei großen Projekten durchaus bemerkbar machen sollte.
Darum macht auch eine Kombination aus Includeguards (für kompatibilität auf jedem Compiler) und der pragma once Direktive Sinn.
Compiler wie der gcc dürften allerdings auch Includeguards entsprechend effizient behandeln.
GreveN hat Folgendes geschrieben: |
Dann ist das angesprochene Problem aber alles andere als gelöst, weil '#define' dadurch immer noch nicht hinfällig ist, ganz im Gegenteil...
Außerdem verkürzt '#pragma once' nur die Zeit, die zum Kompilieren benötigt wird (und nicht mal das zwangsläufig bei jeder Implementierung), was i.d.R. wurst ist. Spätestens wenn man intensiv "metaprogrammiert", kann man sich eh erstmal 'nen Kaffee kochen gehen, während der Compiler arbeitet.
|
Drum ja auch eine Kombination verwenden. Und für die übermäßig langen Kompilierzeiten gibt es ja schöne Lösungsansätze wie PCH usw.
grüße |
|
Nach oben |
|
 |
Kronos Senior JLI'ler

Anmeldedatum: 19.03.2004 Beiträge: 290
Medaillen: Keine
|
Verfasst am: 20.05.2007, 15:52 Titel: |
|
|
DirectXer hat Folgendes geschrieben: |
Beispiel2: CPP: | #define SQUARE(a) a*a
// unten im Code
int x = 5;
int y = SQUARE (x+2); | das ergibt: CPP: | int y = x+2*x+2 // siehe Punkt vor Strich |
Gruß DXer |
Ne du, im ersten Beispiel hast du noch ein sauber geklammertes Makro angeben (wie man es uebrigens _immer_ machen sollte), und im Zweiten klatscht du einfach so ein a*a hin. Es wird einem in _jeder_ Lektüre dazu geraten, ein solches Funktionsdefine _vollständig_ zu klammern, denn:
CPP: | #define SQUARE(a) ((a)*(a))
int x = 5;
int y = SQUARE (x+2);
// result: 49
|
Also da such dir lieber mal ein besseres Beispiel raus .
Aber im Grundtenor kann man hier wohl der Aussage rechtgeben, dass man Präprozessordirektiven/anweisungen in C++ möglichst vermeiden sollte, und es eigentlich immer eine elegantere Lösung gibt. Mal abgesehen von Includeguards o.ä. _________________
David hat Folgendes geschrieben: | Solang meine Beiträge konstruktiver sind als deiner bin ich zufrieden... |
Kein Kommentar notwendig. :rolleyes: |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 20.05.2007, 16:48 Titel: |
|
|
Kronos hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: |
Beispiel2: CPP: | #define SQUARE(a) a*a
// unten im Code
int x = 5;
int y = SQUARE (x+2); | das ergibt: CPP: | int y = x+2*x+2 // siehe Punkt vor Strich |
Gruß DXer |
Ne du, im ersten Beispiel hast du noch ein sauber geklammertes Makro angeben (wie man es uebrigens _immer_ machen sollte), und im Zweiten klatscht du einfach so ein a*a hin. |
mein Gott^^, das sollte ja nur den Grundgedanken wiederspiegeln. Aber auch bei deinem Beispiel würde SQUARE(x++) z.B. nicht das gewünschte ergebnis liefern, s. 1. Bsp.
Kronos hat Folgendes geschrieben: | Es wird einem in _jeder_ Lektüre dazu geraten, ein solches Funktionsdefine _vollständig_ zu klammern, denn:
| Normalerweise sollte einem in _keiner_ C++-Lektüre überhaupt dazu geraten werden, solche Makros, die als Ersatz einer Funktion gelten sollen, zu benutzen(außer in ganz bestimmten Fällen). Aber in C-Lektüren z.B. sitmmt das.
Gruß DXer |
|
Nach oben |
|
 |
Kronos Senior JLI'ler

Anmeldedatum: 19.03.2004 Beiträge: 290
Medaillen: Keine
|
Verfasst am: 20.05.2007, 17:01 Titel: |
|
|
C++ wird vom OP mit keiner Silbe erwähnt, im Anfangsbeitrag zumindest. Aber lassen wir das  _________________
David hat Folgendes geschrieben: | Solang meine Beiträge konstruktiver sind als deiner bin ich zufrieden... |
Kein Kommentar notwendig. :rolleyes: |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|