S
hanni6al schrieb:
Ok!! Ich finde die Makros auch ziemlich klasse trotzdem blicke ich noch nicht ganz durch das Beispiel was ich gebracht hab war ein Teil eines Testbespiels!
was ist am "Makro sind reine Textersetzung" schwierig zu verstehen?
Wenn ich hab:
#define MIN(i,j) (i<j) ? i : j
int min = MIN(num + 5, num + 2)*3;
dann wird, bevor kompiliert wird, den Code überführt in
$ gcc macro.c -E
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "macro.c"
int min = (num + 5<num + 2) ? num + 5 : num + 2*3;
die Zeilen, die mit # anfangen sind nur ein Hinweis für den Compiler, dass der C-Preprozessor am Werk war. Und num + 2*3 ist nun Mal 8. Der C-Preprozessor ersetzt 1:1 das, das du im gibst. Dabei kann es passieren, dass man ungültigen Code erhält und sogar Syntaxfehler. Das ist der Nachteil an Makros, man muss stets wissen, was sie tun.
hanni6al schrieb:
Ich weiß auch was bei deinen Beispiel rauskommt nämlich 20 aber wie komme ich dazu?
keine Ahnung, was raus kommt, es ist undefiniert, es könnte genausogut 100000000 rauskommen:
#define MIN(i,j) (i<j) ? i : j
int val=8;
val += MIN(9, ++val);
expadniert zu:
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "macro.c"
int val=8;
val += (9<++val) ? 9 : ++val;
und die letzte Zeile ist nun mal undefiniert.