Makro funktioniert nicht, warum?
-
ich hab doch gesagt, ich hab es leicht abgeändert und Sachen entfernt, die dem Bsp nicht helfen, deshalb die fehlende \ am Ende.
Ich habe viele Module, die eine get und set Funktion für jedes Datentyp anbietet. Leider sieht diese get/set Funktion in allen Fällen gleich, bis auf den Datentypen. Wieso soll ich redundanten Code (der nur an sehr wenigen Stellen sich ändert) zig-Mal schreiben? Und wenn die Sematik leicht verändert, dann muss ich jede einzelne Funktion verändern. Mit meinem Makro verändere ich nur an einer einzigen Stelle (und sowas musste ich schon ein Paar machen).
Die Idee hab ich aus GTK geklaut, dort gibt (der gab es) solche Makros und fand es angenehm.
@jizzerr:
Makros sind keine Funktionen sondern eine reine *dumme* (fast) 1:1 Textersetzung. Dein Problem wirst du mit Makros NICHT gescheit lösen, höf auf deine Zeit damit zu verschwenden, dafür sind Makros nicht da.
-
Zeus schrieb:
#include <stdio.h> void main() { double base = 2; int exp = 3; printf("Ergebnis: %3f", (double atemp = base; for(;exp>0;exp--)base*=atemp;)); }
Ich kann kein C - sag mir was an dieses C Programm nicht stimmt.
Error 1 error C2146: syntax error : missing ')' before identifier
Error 2 error C2065: 'atemp' : undeclared identifier
Error 3 error C2106: '=' : left operand must be l-value
Error 4 error C2143: syntax error : missing ')' before ';'
Error 5 error C2065: 'atemp' : undeclared identifier
Error 6 error C2059: syntax error : ')'
Error 7 error C2059: syntax error : ')'Deklarationen in einer Anweisung sind das Problem
-
@jizzerr
Hast du nicht gemerkt, dass ich den Präprozessor gespielt habe?
-
Ok
-
Nochmal eine Frage. Um welches Zeichen in der ASCII-Tabelle handelt es sich am ende eines Strings? dez 0 oder dez 48 ? Was meint Null-byte bzw. NULL in C ?
-
jizzer schrieb:
Nochmal eine Frage. Um welches Zeichen in der ASCII-Tabelle handelt es sich am ende eines Strings? dez 0 oder dez 48 ? Was meint Null-byte bzw. NULL in C ?
0 natürlich. Sonst könnte man ja keine '0' im String haben.
-
Ok, und der Backslash ('****0')dient dann nur der Unterscheidung zu ('0') als eigentlichem, dargestelltem Zeichen?
-
jein. Im ASCII-Code sind auch Zeichen enthalten, die nicht gerdückt (dargestellt) werden können (die ersten 32 z.b.). Um diese trotzdem eingeben zu können, muss man "escapen", sprich ein bekanntes Zeichen mit einem vorangehenden Backslash. '\n' ist ein Bsp. dafür, '\n' entspricht ASCII 10. '\0' entspricht 0.
Du kannst aber nicht jedes Zeichen "escapen", z.b. "\1" hat keine Bedeutung im Standard.
-
merci
-
Da hier nur eine philosophische Diskussion über Makros ausgebrochen ist, niemand aber die eigentliche Frage beantwortet hat, hier mal mein Vorschlag:
Allerdings nur für Integer, sonst war's das
#define MPOW(result, base, exp) for (result = 1; exp--; result *= base);
-
du kannst es aber nicht als r-value benutzen, wie jizzer es haben will. D.h, sowas wie
int x = MPOW(x, 2, 4); printf("%d\n", MPOW(???, 2, 4));
geht schief.
-
Wäre es nicht sinnvoll bei MPOW den Parameter result wegzulassen, da er eh auf 1 gesetzt wird?
Und, dass es keinen return-wert gibt sehe ich auchGuten Abend noch
-
nein, es ist nicht sinnvoll, da du mehrere Anweisungen hast und while/for Schleifen keinen Wert zurückliefern können.
Hör auf dich mit dem Schwachsinn zu beschäftigen. Es ist so, als würdest du dir Gedanken machen, wie du in die Dusche reingehst, ohne naß zu werden.
-
Ich versuche bloß das Beispiel zuendezudenken - vom eigentlichen Nutzen mal abgesehen - und lerne damit ein paar Feinheiten von C dazu.
PS: Hast du vll ne Antwort zu dem struct-thread?
-
Makro sind nur in Verbindung mit Templates gut, aber das ist dann C++ *gg*
-
jizzerr schrieb:
Ich versuche bloß das Beispiel zuendezudenken - vom eigentlichen Nutzen mal abgesehen - und lerne damit ein paar Feinheiten von C dazu.
PS: Hast du vll ne Antwort zu dem struct-thread?
das führt aber zu keinem vernünftigen Ergebniss, es ist so, als würdest du im Handwerkerforum doch nachfragen, wie man es doch hinkriegt, mit dem Schraubenzieher einen Nagel in die Wand zu hammern (um bloß das Beispiel zuendezudenken), und dort werden sie dir auch sagen, dass ein Schraubenzieher kein Hammer ist. Hier genauso, ein Makro (== Schraubenzieher) ist keine Funktion (== Hammer). Wenn eine Funktion in einem Makro semantisch 1:1 nachimplementieren könntest, dann bräuchte man keine Funktionen und man würde nur Makros haben. Verschwende deine Zeit mit diesem Unsinn nicht.
So wie du es benutzen willst, wirst du mit einem Makro nicht hinkriegen, da brauchst du nichts zu Ende zu denken, du reitest auf ein totes Pferd.