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

1

21.06.2007, 21:47

Wann sollte man #ifndef, #endif und #pragma once verwenden?

:arrow: Ich befinde mir zurzeit auf Setie 245-247 Kapitel 8"Fortgeschrittene Themen" bei den Singletons

Nun, folgte sogleich nach einer etwas verstörrenden Beschreibung zu Singletons der erste Quelltext dazu.
Dort lautet es in den ersten zwei Zeilen:

#ifndef TSINGLETON
#define TSINGLETON

und in der letzten Zeile

#endif

nun, das es sich bei define um eine mit einem Präprozessorbefehl handelnte Konstante bzw. Textersetzung handelt bin ich mir im klaren aber was es mit #ifndef und #endif aufsich hat kann ich mir nicht beantworten.
In der Erklärung sieht es aber so aus, als wäre dies schon längst besprochen worden, und wird längst vorrausgesetzt.
Dort heißt es nämlich: "In den ersten beiden Zeilen werden die Präprozessordirektiven #ifndef :shock: und #define verwendet, um mögliche Mehrfachdeklarationen vorzubeugen :shock: , falls die Header-Datei an mehreren Stellen eingebunden wird. In Zeile 58 findet man das zugehörige #endif. :shock:

Da ich mir aber zu 100% sicher bin, das diese Präprozessorbefehle noch nicht vorkammen, bin ich ganz schon :shock: aus dem Wind, da ich echt keine Ahnung habe was sie dort machen, wie sie funktionieren und allgemein.

Hoffe mir kann einer aus dieser Mysere helfen.

:arrow: Mal wieder!

2

21.06.2007, 22:01

Hmm ... damit der Inhalt der Headerdatei nur einmal gelinkt wird, guckst du ob TSINGLETON schon definiert ist(#ifndef TSINGLETON ) ... wenn das der Fall ist, springt er bis zum Ende(#endif) und an sonnsten definiert er TSINGLETON (#define TSINGLETON) und guckt sich auch an was zwischen dem #ifndef und dem #endif steht.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

3

21.06.2007, 22:06

:shock: Okay, aber woher sollte ich das wissen, immerhin steht davon nix im Buch!?

Für was ist den die Abkürzung ifndef und endif?
Spekulation: ifndef= if = if-Bedingung, nd = and, ef= else if?
: endif= end if-Bedingung

Sheddex

unregistriert

4

21.06.2007, 22:12

ifndef = if not defined

Du kannst übrigends, sofern du eine Microsoft IDE verwendest, auch einfach "#pragma once" an den Anfang der Header schreiben. Den Rest kannst du dir dann sparen, sieht auch viel schöner aus imho.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.06.2007, 22:12

Zitat von »"Deviloper"«

Hmm ... damit der Inhalt der Headerdatei nur einmal gelinkt wird, guckst du ob TSINGLETON schon definiert ist(#ifndef TSINGLETON ) ... wenn das der Fall ist, springt er bis zum Ende(#endif) und an sonnsten definiert er TSINGLETON (#define TSINGLETON) und guckt sich auch an was zwischen dem #ifndef und dem #endif steht.


... damit der Inhalt der Headerdatei nur einmal inkludiert wird. Zum linken kommt der Compiler sonst garnicht mehr! ;-)

@Topic:
Wenn du einen entsprechenden Compiler verwenden solltest (z.B. Visual C++ von Microsoft) kannst du zusätzlich noch eine Pragmadirektive verwenden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#ifndef __SINGLETON_H_
#define __SINGLETON_H_

#if _MSC_VER > 1000
    #pragma once
#endif

// Dein Code


#endif
@D13_Dreinig

Sheddex

unregistriert

6

21.06.2007, 22:14

Warum zusätzlich? Ich dachte immer, das wäre einfach ein Ersatz dafür...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

21.06.2007, 22:17

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

8

21.06.2007, 22:19

Erst mal herzlichen Dank für die Infos und die Antworten.
Nur was mich noch beschäftigt ist, woher ich das wissen sollte, denn dies wird irgendwie vorrausgesetzt in diesem Abschnitt obwohl es meines erachtens noch nicht angesprochen geschweige denn erklärt wurde

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

21.06.2007, 22:24

Is vielleicht nicht gerade optimal etwas vorauszusetzen was ein Anfänger nicht unbedingt wissen kann. Aber es gibt ja zum glück Internetquellen um sich zu informieren!
@D13_Dreinig

10

21.06.2007, 22:27

Yup stimmt.
War nur etwas ungewohnt, da in diesem Buch sämtliche Themengegenstände ausführlich behandelt werden, naja bis auf diese zwei Dinge.
Ist natürlich nicht weiter schlimm.

Danke nochmal an alle für die Antworten

Werbeanzeige