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

14.12.2011, 16:11

Auf define in namespace zugreifen

Hi,

angenommen ich habe eine Klasse für globale Variablen wie z.B.:

C-/C++-Quelltext

1
2
3
4
namespace ABC
{
#define GAME_CAPTION "Superawesome Killer Game"
}


Wie greife ich darauf ohne die using-Direktive zu?

C-/C++-Quelltext

1
ABC::GAME_CAPTION
funktioniert nicht. Warum nicht?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

14.12.2011, 16:18

Das ist keine Globale Variable sondern eine Konstante, die per Textersetzung eingefügt wird. Ein Makro eben. Der Präprozessor dürfte Namespaces ignorieren also müsstest du entweder direkt drauf zugreifen können (oder, was ich nicht glaube, garnicht). Ich benutz Makros so gut wie nicht und weiß es deshalb nicht genau. Ich komm super ohne aus. Vielleicht solltest du es auch mal ohne Probieren?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

14.12.2011, 16:27

Naja normal:

C-/C++-Quelltext

1
using namespace ABC;


Aber wie NachoMan schon sagt, das funktioniert nicht mit Makros.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

14.12.2011, 16:31

using namespace sollte man auch höchstens in Ausnahmefällen benutzen. Besonders wenn man die Sprache noch lernt. :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

14.12.2011, 16:49

Hmm doch er müsste eigentlich direkt drauf zugreifen können, da das define ja eine Textersetzung durchführt, und die findet soweit ich weiß vor dem "semantischen" statt also da is nichts mit scopes und so... also kannst du defines vergessen.

Was du willst, ist sowas wie:

C-/C++-Quelltext

1
2
3
4
namespace ABC
{
   static const char GAME_CAPTION[] = "Superawesome Killer Game";
}


Das geht. Besser natürlich:

C-/C++-Quelltext

1
2
3
4
namespace ABC
{
   static const String GAME_CAPTION = "Superawesome Killer Game";
}



Und dann kannst du natürlich sowas wie:

C-/C++-Quelltext

1
2
3
4
5
using namespace ABC;

// oder besser
using ABC::GAME_CAPTION;
}


machen.

PS: Witzig, ABC gibt es bei mir schon, wegen <windows.h> :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.12.2011, 16:54

Der Präprozessor hat keine Ahnung von Namespaces, sowas wie ein namespace macht in Zusammenhang mit #define also absolut keinen Sinn. Das ist auch einer der wesentlichen Gründe warum du #define nicht für sowas verwenden solltest. Makros braucht man in C++ generell praktisch überhaupt nicht, denn mit const, inline und templates hast du da sehr viel bessere Werkzeuge.
Databyte hat schon gezeigt wie's richtig geht, wobei ich das static in seinem Beispiel weglassen würde weil es ein Relikt aus C und noch dazu in dem Fall überflüssig ist ;)

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (14.12.2011, 17:02)


7

14.12.2011, 17:31

inline ist doch was für die Funktionen. Die Rücksprungadresse und die Parameter werden dabei doch auf den Stack gelegt, wodurch die Funktion einfach schneller aufgerufen werden kann, natürlich werden die auch wieder freigegeben.
Oder liege ich damit im Unrecht?
Sowieso benutzt man dies, oder sollte man dies, nur bei kleinen Funktionen die oft aufgerufen werden, also z.B. "Getter" oder "Setter".

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

14.12.2011, 17:35

inline ist doch was für die Funktionen.

Ja

Die Rücksprungadresse und die Parameter werden dabei doch auf den Stack gelegt, wodurch die Funktion einfach schneller aufgerufen werden kann, natürlich werden die auch wieder freigegeben.

inline ist ein Hinweis an den Compiler dass er die Funktion inlinen, d.h. im Prinzip einen Funktionsaufruf direkt durch den Code der Funktion ersetzen, soll.
Damit das funktioniert, muss die Definition der Funktion bekannt sein, daher erlaubt inline im Prinzip, die Funktion in einem Header zu definieren ohne dass es zu Linkerfehlern kommt.

Sowieso benutzt man dies, oder sollte man dies, nur bei kleinen Funktionen die oft aufgerufen werden, also z.B. "Getter"

Man benutzt das vor allem wenn man Funktionen in einem Header definieren will, was der Fall sein wird wenn man eine Funktion statt eines Makros benutzen will ;)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

14.12.2011, 17:55

Inline ist toll, es bringt nicht wirklich was, aber trotzdem fühlt man sich besser xD

10

14.12.2011, 18:06

Die Entscheidung hat letzten Endes der Compiler, wie ich erlernte.

MfG
Check

Werbeanzeige