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

07.04.2008, 17:31

Sinn von #ifndef und #endif

Hallo Leute,
ich bin gerade im Kapitel 9 "STL".
Dort wird von #ifndef
und #endif gesprochen, aber
nicht genau erklärkt, was das ist. Kann mir jemand
sagen, wofür diese Befehle gut sind? :?:

mfg
Altair
void CreateComputerGame (int Quality);

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

07.04.2008, 18:04

bei diesem befehlen spricht man von so genannter bedingten compilierung. das bedeutet, wenn z. b. ein bestimmtes symbol definiert ist, dann wir der von if endif compiliert, ansonsten ignoriert.

ma nen einfaches beispiel

C-/C++-Quelltext

1
2
3
4
5
6
7
#define foo

#ifdef foo

int i = 0;

#endif


hier würde die variable i erzeugt werden, weil das symbol foo definiert ist (kann auch in einer andren datei sein). würdest du dei zeilde define weg lassen, würde i nicht erzeugt werden durch den compiler.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

07.04.2008, 18:07

Das hat was mit den unterschiedlichen Interpretationsphase beim Erstellen zu tun. Alle Anweisungen die mit # anfangen sind Präprozessoranweisungen. Kannst dich ja mal im Inet über diese schlau machen. Salopp gesagt, sorgt das ifndef/ifdef/endif dafür, dass bestimmte Teile des Code sichtbar sind bzw nicht sichtbar. Jenachdem ob die entsprechenden Sachen definiert sind oder nicht. Braucht man z.B. bei crossplattform Code oder Debug<->Release Umstellung.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

07.04.2008, 18:08

Sowas ist recht nützlich für include-Guards und für Dinge wie plattformunabhängigkeit, wo man den Code für mehrere Plattformen "nebeneinander" schreiben kann.
Lieber dumm fragen, als dumm bleiben!

Terep

Frischling

Beiträge: 46

Wohnort: Region Hannover

  • Private Nachricht senden

5

12.05.2008, 21:44

Hi Altair

Ist zwar schon 4 Wochen her, aber nach meiner Meinung hat noch keiner richtig geantwortet.
Ich habe das Thema nicht in Kapitel 9 gefunden, sondern im Kapitel 8.6 Listing Singletons (Kalista-Buch 2. Auflage).

Folgendes gehört zusammen:

Quellcode

1
2
3
4
# ifndef TSINGLETON
# define TSINGLETON
// Quellcode der Headerdatei
#endif  // TSINGLETON

Die Problematik:
Es kann zu Problemen in der Übersetzung führen, wenn man versucht Header-Dateien mehr als einmal einzubinden. Je größer die Anwendungen, umso größer die Gefahr der Mehrfacheinbindung. Schaue Dir zum Beispiel die windows.h an. Um nicht wie ein Luchs aufpassen zu müssen, lässt man das System selbst prüfen:

Die Lösung in der Anwendung:
Im 1. Versuch
# ifndef TSINGLETON
wenn_nicht_definiert = true
bedeutet: ist TSINGLETON noch nicht eingebunden, dann tue alles das, was bis zum
#endif steht.

Beim 2. Versuch und jeden weiteren Versuch TSINGLETON einzubinden, greift der englische Mathematiker George Boole 1815-1864 ein. Er hat die Boolesche Algebra entwickelt und ist der Namensgeber für bool.
# ifndef TSINGLETON
wenn nicht definiert = false
klare if-Sache; bedeutet: ist TSINGLETON ist eingebunden, tue nichts und gehe direkt nach
#endif

Wenn Du darauf achtest, wirst Du dies in allen großen Anwendungen entdecken. Es ist also wichtig und auch noch einfach in der Anwendung!

Terep
Avatar = „Odyssee im Weltraum“
Film von Stanley Kubrick (Warner Brothers)
nach dem Buch von Arthur C. Clarke.
It will becoming true ?!!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

13.05.2008, 09:00

Das ist aber nur eine Einsatzmöglichkeit von #if ... #endif. Im allgemeinen werden diese Präprozessordirektiven verwendet um zur Kompilierzeit, über Bedingungen, Quellcodeteile aus- bzw ein zu schließen.
Will man z.B. für verschiedene Platformen entwickeln so kann man Datentypen definieren die immer eine bestimmte größe haben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#if _WIN32
  typedef signed int int32;
#elif _WIN64
  typedef signed long int32;
#else
  #error Unsupported platform
#endif

assert( sizeof( int32 ) == 4 );
@D13_Dreinig

7

13.05.2008, 19:54

Insbesondere wird es genutzt fuer inclusion guards. SieheTerep, aber es ist nicht beschraenkt auf Singletons. Singletons sind immer schlechte Beispiele :-).

Werbeanzeige