JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=481fae66557581161968ca7e6b2ea156Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Defines, Makros, etc.
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 15:21    Titel: Antworten mit Zitat

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
Code:
#pragma once
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
Benutzer-Profile anzeigen Private Nachricht senden
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 15:37    Titel: Antworten mit Zitat

öhm.. wieso effizienter?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 15:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 15:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kronos
Senior JLI'ler



Anmeldedatum: 19.03.2004
Beiträge: 290

Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 15:52    Titel: Antworten mit Zitat

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 Wink.
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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 16:48    Titel: Antworten mit Zitat

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

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kronos
Senior JLI'ler



Anmeldedatum: 19.03.2004
Beiträge: 290

Medaillen: Keine

BeitragVerfasst am: 20.05.2007, 17:01    Titel: Antworten mit Zitat

C++ wird vom OP mit keiner Silbe erwähnt, im Anfangsbeitrag zumindest. Aber lassen wir das Wink
_________________
David hat Folgendes geschrieben:
Solang meine Beiträge konstruktiver sind als deiner bin ich zufrieden...

Kein Kommentar notwendig. :rolleyes:
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
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

Impressum