C++ #define Welche Bedeutung an bestimmter Codestelle?

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Es geht um follgenden Code:

Code:
#ifndef FRAMEWORK_HPP
#define FRAMEWORK_HPP

#include <iostream>
#include "Singleton.hpp"
#include "Timer.hpp"

using namespace std;

#define g_pFramework CFramework::Get()

class CFramework : public TSingleton<CFramework>
{
  public:
    bool  Init    (int ScreenWidth, int ScreenHeight,
                   int ColorDepth, bool bFullscreen);
    void  Quit    ();
    void  Update  ();
    void  Clear   ();
    void  Flip    ();
    bool  KeyDown (int Key_ID);
    SDL_Surface *GetScreen () {return m_pScreen;}

  private:
    SDL_Surface *m_pScreen;   // Surface für den Screen
    Uint8       *m_pKeystate; // Array für aktuellen Tastaturstatus

};

#endif

Nachdem ich jetzt die Bedeutung von "#indef" und "#endif" ergründen konnte habe ich noch ein Problem mit "#define". Ich weiß, dank meiner Googlesuche, dass es sich um eine möglichkeit Handelt eine Anweisung also z.b Funktionsaufruf in eine einfachere Schreibweiße umzuformen. Was ja in Zeile 10 direkt nach "using namespace std" gemacht wird. Allerdings weiß ich nicht wozu das "#define" in der 2 Zeile direkt unter "#indef.." benötigt wird.

Ich würde mich freuen, wenn das jemand Erläutern würde :)
 
Es handelt sich ja offensichtlich um eine Header-Datei mit Defintionen.

Nun können aber verschiedene Programmteile (Programmdateien, gerade bei größeren Projekten) alle versuchen, diese eine Header-Datei einzubinden. Das ist grundsätzlich nicht schlimm, das Problem ist aber, dass dann eben alle in dieser Datei vorkommenden Typen und Variablen mehrmals definiert werden - das mag der Compiler gar nicht.

Die Header-Datei verhindert über diesen Ausdruck
Code:
#ifndef MEINNAME
#define MEINNAME
[...]
#endif
dass sie mehrmals eingebunden wird (bzw mehrmals die selben Typen zu definieren versucht).

Wenn die Datei bereits wo anders includiert wurde, ist das "Flag" MEINNAME bzw FRAMEWORK_HPP bereits gesetzt - insofern wird alles was zwischen dem #ifndef und #endif steht übersprungen.

Sinnvoll ist die Namenskonvention, wie in deinem Codebeispiel gezeigt, einzuhalten.
 
Zuletzt bearbeitet:
Mit #define erstellst du ein Makro. g_pFramework wird dann im Quelltext durch CFramework::Get() ersetzt.
 
Ich finde den Begriff Makro hier recht unzutreffend, auch wenn es so genannt wird.
Es findet eine schlichte Textersetzung vor dem Compilieren statt, an jeder Stelle wo "g_pFramework" steht, wird nun "CFramework::Get()" eingesetzt.
Ist glaub ich für einen Anfänger auch so besser verständlich.
 
Spartaner117 schrieb:
Ich finde den Begriff Makro hier recht unzutreffend, auch wenn es so genannt wird.
Es findet eine schlichte Textersetzung vor dem Compilieren statt, an jeder Stelle wo "g_pFramework" steht, wird nun "CFramework::Get()" eingesetzt.
Ist glaub ich für einen Anfänger auch so besser verständlich.

...was nicht korrekt ist.

Eine "schlichte" Textersetzung wäre einfach das Ersetzen eines statischen Textes durch einen anderen...

Code:
#define MAX(x,y) (x>y?x:y)

Würde mit einer "schlichten" Textersetzung im Source nur "MAX(x,y)" ersetzen, nie aber "MAX(2,1)" oder "MAX(a,b)" oder "MAX (3,a)" oder oder oder...


Du hast sicher in einer Art Recht - eine Textersetzung wird vorgenommen... Nur wird trotzdem der Ausdruck vom Compiler interpretiert und verarbeitet.
 
Leute, es geht ihm eigentlich nur um das #define nach #ifndef...
 
Abcd12345 schrieb:
Nachdem ich jetzt die Bedeutung von "#indef" und "#endif" ergründen konnte habe ich noch ein Problem mit "#define". Ich weiß, dank meiner Googlesuche, dass es sich um eine möglichkeit Handelt eine Anweisung also z.b Funktionsaufruf in eine einfachere Schreibweiße umzuformen.
Auch wenn es eine Möglichkeit darstellt, und manchmal sogar unumgänglich ist, zB wenn man __LINE__ im ersetzenden Ausdruck verwenden möchte, ist das idR keine gute Lösung. Besser sind hierfür inline Funktionen.

Abcd12345 schrieb:
Allerdings weiß ich nicht wozu das "#define" in der 2 Zeile direkt unter "#indef.." benötigt wird.
Das sind sogenannte Include Guards. 1668mib hat es ja schon erklärt, damit werden Mehrfachdefinitionen unterbunden. Solche verstossen nämlich gegen das ODR Konzept. Stände in Zeile 2 kein
Code:
#define FRAMEWORK_HPP
würde der Bezeichner FRAMEWORK_HPP nie definiert, der Block zwischen #ifndef und #endif nie übersprungen und damit der Code dazwischen immer eingebunden werden.

Manche Compiler unterstützen für Include Guards auch
Code:
#pragma once
Das ist allerdings nicht standardisiert.
 
Zurück
Oben