Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was macht "#define"???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.08.2004, 11:06 Uhr
Unwissende
...die wirklich Unwissende 8-)


Hallo,

meine Kollegen und ich sind gerade am Überlegen, was denn das "#define" genau macht?
Eigentlich ist das ja nur reiner Textersatz, oder?
Was ist der Unterschied zu "const", also Konstanten?

--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.08.2004, 11:20 Uhr
(un)wissender
Niveauwart


Google hilft da.
#define definiert einen String mit Wert (kann alles sein, auch Code) und ersetzt im ganzen Quelltext diesen String durch den Wert, es hilft außerdem bei bedingter Kompilierung, mit #ifdef bla #endif kann man abfragen, ob etwas definiert worden ist.
Konstanten sind echte Variablen und in C++ #define vorzuziehen, bei dem bedingten Kompilierung brauchst du aber weiterhin #define. Das Problem mit #define ist, dass alle durch #define definierten Literale in allen Dateien sichtbar ist, mit einer Konstanten kannst du das anderes regeln.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.08.2004, 11:24 Uhr
RedEagle



damit kann man doch auch sowas machen, oder??

C++:
#define x=((y)+(z))*(w)


--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.08.2004, 11:39 Uhr
(un)wissender
Niveauwart


So wäre es korrekt:


C++:
#define x(y,z,w) (((y)+(z))*(w))



Allerdings ist inline tausendmal besser, aus bekannten Gründen.


Bearbeitung:

Hier ein kleines Beispiel:

C++:
#include <iostream>

#define x(y,z,w) (((y)+(z))*(w) + (y))

int main()
{
    int y = 0, z = 1, w = 1;
    
    int result = x(y++,z,w);
    std::cout << result << std::endl;
    std::cout << y << std::endl;
    return 0;
}



Hier läuft einiges schief, siehst du es?


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.08.2004 um 11:50 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.08.2004, 12:26 Uhr
Pablo
Supertux
(Operator)


const sind wie wissender sagte schon Variablen, deren Wert nicht mehr geändert werden kann, aber sie sind fest, d.h. sie haben nur diesen Wert und das war's.

#define sind nur Ersatzstring, es kann beliebiger Code sein, eine Zahl, Variable, Text usw sein. Unter C sehr beliebt aber ich hab immer wieder gelesen, dass man unter C++ #define nicht benutzen (vielleicht kann ein CPPler mehr drüber sagen, ich weiß es nicht).

#define kann auch schief gehen und mächter Ärger vorbereiten, wenn man z.b. ein #define mit Code hat. Es kann sein, dass es Klammerung fehlt oder dass man den Code nicht mehr kompilieren kann.


C++:
#include <stdio.h>

#define min(x,y)  (x < y ? x : y)
#define fib(x)  (!x? 1 : fib(x-1) + fib(x-2))

int main()
{
    printf("Min (3,5)=%d\n", min(3,5));
    printf("fib(8)=%d\n", fib(8));
    return 0;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 12.08.2004 um 16:14 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.08.2004, 13:15 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von (un)wissender:
Allerdings ist inline tausendmal besser, aus bekannten Gründen.

Inline muss vom Compiler allerdings nicht beachtet werden, so das er es oft in eine nicht inline Funktion übersezt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.08.2004, 13:25 Uhr
RedEagle



was ist den an inline so besonders??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.08.2004, 14:17 Uhr
(un)wissender
Niveauwart


Nichts.
Der Code wird nur expandiert und zwar in den Aufrufer.
Aber Guybrush Threepwood hat schon recht inline ist nur einen Empfehlung an dem Compiler.
Trotzdem besser als Makros...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.08.2004, 14:19 Uhr
(un)wissender
Niveauwart


@Pablo
Du solltest jedem Makroparameter extra klammern, sonst funzt das Makro ev. nicht so wie erwartet.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.08.2004, 16:13 Uhr
Pablo
Supertux
(Operator)


@wissender: genau das wollte ich auch vermitteln, dass man bei Makros auch sehr schnell Fehler machen kann, und sie gar nicht merken. (Ich hab die Klammern absichtlich weggelassen)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: