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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

14.05.2006, 09:26

#define

tagchen leute :)

hab mal wieder ne frage!

heiko verwendet hier und da mal die anweisungen #ifndef, #define, #endif

also #ifndef und #endif erklären sich von selbst.. aber was hat es mit dem #define aufsich?

beispielsweise

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef TIMER_HPP // is klar

#define TIMER_HPP // das nicht :P


//...


#endif // is auch klar :)


also .. was is das dann ?? eine variable namens TIMER_HPP ? oder ein makro? so ganz genau wurde das ja nicht erklärt was #define jetzt wirklich macht..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

2

14.05.2006, 09:38

Nein da liegst du falsch :)

Das ist der Includeguard der mehrfache Definitionen verhindert :)

Ist simpel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//Wenn Timer_hpp noch nicht definiert ist:

#ifndef Timer_hpp

//Dann soll es ab hier definiert werden:

#define Timer_hpp

//Variablen(global==böse!!!)

//Funktionsdeklarationen usw!


//Hier ist die definition zuende!

#endif //Timer_hpp


Falls man diese HPP mehr fach inkludiert dann sind die Deklarationen bekann und da er sie kennt geht es nachdem #endif weiter :)

Würde ich sowas aber ohne den Inkcludeguard machen kämen Fehlermeldungen wie FunktionXY(bla, blub) wurde neudefiniert!

Und sowas vermeidet man damit ;)

Das sieht man häufig bei .h dateien und .hpp :)
Aber es geht nicht bei .c/.cpp dateien :)
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

3

14.05.2006, 09:53

Tjo... nen #define.... hmm wird eigentlich durch nen preprozessor gejagt... und der ersetzt die Stelle an der define ist halt mit dem mit define definierten Wert.


Bei dem Include Guard ist es halt so, das der mit #ifndef guckt ob bsw. TIMER_HPP noch nicht definiert ist. Wenn es schon definiert ist, lässt der den gesammten block raus, ist es noch nicht definiert, wird es definiert und der block der in der ifndef klammer steht wird benutzt.


Wobei man #define in den meisten Fällen vermeiden sollte.

Aja... man kann auch bei vc #pragma once benutzen...
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

Jetter

Frischling

Beiträge: 9

Wohnort: Erfurt

  • Private Nachricht senden

4

14.05.2006, 11:21

Erstmal: Hallo! (Ich schreib zum ersten Mal...)

Also ich finde #define wird auf seite 39f gut erklärt, wenn dir das nicht reicht, bei:

C-/C++-Quelltext

1
#define WERT 50


wird vor dem Kompilieren über all wo "WERT" steht, "50" eingesetzt.
Also aus:

C-/C++-Quelltext

1
if (x < WERT)


wird:

C-/C++-Quelltext

1
if (x < 50)

Anonymous

unregistriert

5

14.05.2006, 11:32

Jetter
Knackfrage:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define WERT 50
const unsigned long WERT_CONST = 50;

void foobar (int value);
void foobar (long value);
void foobar (unsigned long value);
void foobar (unsigned char value);
void foobar (char value);
void foobar (float value);
void foobar (long long value);
void foobar (long double value);
void foobar (double value);
void foobar (short value);
void foobar (unsigned short value);

foobar (WERT); // Na wer wird aufgerufen? Rate mal!

foobar (WERT_CONST); // Wer wird hier aufgerufen?

Merk Dir:
1. #define hat nichts mit dem Compiler zu tun!
2. #define ist absolut typunsicher!
3. #define sollte man nur im äußersten notfall benutzen!
4. #define sollte man nicht für typunsichere Konstanten und typunsichere Makros vergewaltigen (Ja das ist eine Vergewaltigung des Präprozessors!)
5. #define wird nicht vom Compiler erfasst als reale Variable/Konstante/Funktion

kurz: #define suckt und hat nur bei 2 Dingen was zu suchen:
1. Portabilitätsbeschränkungen
2. Includeguards.

Also: be wise and don't use #define!

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

6

14.05.2006, 11:36

Ich kanns erraten:

C-/C++-Quelltext

1
2
3
4
5
//Damit wird jede Funktion aufgerufen :D solls aber nicht ;)

#define WERT 50 

//Damit wird void foobar (unsigned long value);  aufgerufen oder müsste das nicht void foobar (const unsigned long value); heißen?

const unsigned long WERT_CONST = 50;
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

7

14.05.2006, 11:40

T-VIRUS
Nö es werden nicht alle aufgerufen! Der Compiler sagt: "Tja Du Depp! Ich kann nicht erraten welche Funktion Du willst, da Du zu Inkompetent bist einen Typen zu spezifizieren! Also leck mich, hier friss den Error und komm erst wieder, wenn Du gelernt hast!"

So in etwa wird Dein Compiler reagieren.

Nein kann const heißen muß es aber nicht. const sagt nur aus das es eine Konstate ist.

Jetter

Frischling

Beiträge: 9

Wohnort: Erfurt

  • Private Nachricht senden

8

14.05.2006, 12:09

@nix da:
Ich bin vollkommen deiner Meinung nur wollt ich es $nooc erklären...
Es gibt definitiv bessere Varinten als #define. (s.oben)
Steht auch im Buch, das #define nicht sehr empfehlenswert is.

Obwohl ich sagen muss das #define bei Roboterprogrammierung in Interactive-C sehr gute Dienste leistet, da kein Speicher benötigt wird.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

14.05.2006, 12:21

Zitat von »"nix da"«

T-VIRUS
Nö es werden nicht alle aufgerufen! Der Compiler sagt: "Tja Du Depp! Ich kann nicht erraten welche Funktion Du willst, da Du zu Inkompetent bist einen Typen zu spezifizieren! Also leck mich, hier friss den Error und komm erst wieder, wenn Du gelernt hast!"

Also mein Compiler nimmt gemäß C++-Standard die int-Variante und beschimpft auch niemanden.

Zitat von »"Jetter"«

Obwohl ich sagen muss das #define bei Roboterprogrammierung in Interactive-C sehr gute Dienste leistet, da kein Speicher benötigt wird.

Der Compiler hat auch bei Konstanten die Möglichkeit, diese direkt in den Objektcode "hardzucoden". Mit eingeschalteten Optimierungen sollte er das auch tun ...

Anonymous

unregistriert

10

14.05.2006, 12:22

David Scherfgen
Meiner sagt, dass es Mehrdeutig ist.

Jetter
const wird i.d.R. wegoptimiert.

Werbeanzeige