Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LagRange

Frischling

Beiträge: 26

Wohnort: dzt. Aalborg, DK

Beruf: Student

  • Private Nachricht senden

11

22.06.2007, 01:00

Zitat von »"David_pb"«

Includeguards sind halt Standardkonform, drum ja auch nochmal der Compilercheck (#if _MSC_VER > 1000). :)

Aber warum doppelt? Gibt es irgend welche Vorteile wenn man die Pragmadirektive beim MS Compiler einsetzt? (nicht dass ich den verwenden würde :badgrin: )
Science is common sense applied to evidence.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

22.06.2007, 08:41

Ja gibt einen Vorteil. Bei Includeguards wird bei jedem Inkludieren die Datei geöffnet und geprüft oder das Macro bereits definiert wurde.
Wenn #pragma once verwendet wurde merkt sich der Compiler das und öffnet diese Datei bei weiteren Inkludierversuchen erst garnichtmehr, man spart sich also das (im Vergleich) recht Zeitaufwendige öffnen der Datei und das Prüfen des Preprozessors.

Beides verwenden sollte man dann, wenn man die Optimiernung von #pragma once haben, aber das Projekt auch Standardkompatibel (im Falle der Kompilation auf anderen Compilern die kein #pragma once unterstützen) Inkludiersicher halten will.
@D13_Dreinig

13

22.06.2007, 15:22

So zeitaufwendig ist das auch nicht....
Außerdem ist #pragma once nur bei Visual Studio verfügbar!
http://www.pennergame.de/functions/generate_signature_114955.jpg

Wo die Fähigkeiten aufhören ... fängt der Optimismus an

"Unendlichkeit ist der Mangel an Grenzen" Aristoteles

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

22.06.2007, 18:47

Zitat von »"Giesbert"«

So zeitaufwendig ist das auch nicht....
Außerdem ist #pragma once nur bei Visual Studio verfügbar!


Es ist zeitaufwendiger als die Datei einfach nicht zu öffnen. Bei größen Projekten macht sich das auf jedenfall bemerkbar. Und wenn man Visual Studio schon verwendet, was spricht dann gegen #pragma once?
@D13_Dreinig

15

22.06.2007, 22:47

Nach nun längeren Kopfzerbrechen habe ich etwas zu Verkünden

:arrow: :idea: Ich habs (so hoffe ich) Verstanden :D
Und zwar:

Alles was nach #define TSINGLETON steht/folgt, ist praktisch der neu "Text" der TSINGLETON ersetzen soll. :arrow: Also die Klasse um genau zu sein!!
Soit wird überall wo "TSINGLETON" steht die Klasse ausgeführt, da es sich ja bei #define um eine Textersetzung handelt.

#ifndef soll wenn TSINGLETON noch nicht definiert(defined) wurde alles was nach dieser Präprozessordirektiven folgt ausführen bis #endif erreicht wurde :D :arrow: Ich bin sowas von :D :D Glücklich :D :D :D :D :D :D :D
Was ich nur nicht wusste ist, das alles was nach #define folgt als der neue ersetzende "Text" gilt, da ich nur dachte das was in der selben Zeile steht, wie ich es im Kapitel 2 gelernt hatte:

#define zuersetzenderText NEUERTEXT

Ich bin so Glücklich :D :D :D Den ganzen letztrigen Abend und den heutigen Tag habe ich mir darüber den Kopf zerbrochen, okay ich muss natürlich zugeben, dass ich wieder mal auf dem Schlauch stand :roll:

Natürlich wäre ich so schnell nie drauf gekommen, hätte ich nicht so gute Antworten bekommen. Danke Danke
"Wenn es keine Milch gäbe, würde ich auf Kaffee verzichten."

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

16

22.06.2007, 22:56

Also egtl. definiert #define TSINGLETON nur den Begriff.
Bsp.
Du hast eine Datei, die in jeder Datei aufgerufen wird. Um zu verhindern, dass Variablen mehrfach definiert werden und die Datei mehrfach geladen wird definierst du ganz einfach einen Begiff und nur wenn es den noch nicht gibt wird das folgende ausgeführt

C-/C++-Quelltext

1
2
3
4
#ifndef UNBEKANNT // Wenn UNBEKANNT noch nicht definiert ist

#define UNBEKANNT // dann wird es jetz definiert und der folgende Code nur noch einmal durchgegangen

//Bla Bla Bla 

#endif // Die If-Schleife ist beendet

17

22.06.2007, 23:03

Ja genau, das wollte ich ja oben Ausdrücken.
Kann sein das es in meiner Euphorie nicht wiriklich zu verstehen war, was ich oben Ausdrücken wollte.

Aber der Rest von mir ( also nicht ich, sondern von meinen Beiträg) hat gepasst
"Wenn es keine Milch gäbe, würde ich auf Kaffee verzichten."

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

18

23.06.2007, 00:23

Grausam, auf was für Gedanken du kommst :shock:

Das richtigste an deiner 'Erkenntnis' war noch, dass #define (solange man kein \ verwendet) nur für eine Zeile gilt... TSINGLETON steht also nicht für die gesamte nachfolgende Klasse sondern ist nur ein Begriff, der entweder garnicht oder leer definiert wird... wenn er garnicht definiert ist wird er in folge definiert, wenn er bereits definiert ist wird der gesamte Abschnitt zwischen #ifndef und #endif übersprungen.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

19

23.06.2007, 00:51

im übrigen steht genau das auch im Buch, nur etwas kürzer... wobei wir wieder beim Anfangsproblem wären...

Zitat von »"Buch"«


"In den ersten beiden Zeilen werden die Präprozessordirektiven #ifndef und #define verwendet, um mögliche Mehrfachdeklarationen vorzubeugen, falls die Header-Datei an mehreren Stellen eingebunden wird. In Zeile 58 findet man das zugehörige #endif.

Werbeanzeige