Forum: PC-Programmierung Makro bitte überprüfen!


von hans (Gast)


Lesenswert?

[c]#define U_F_GET_RET_TYPE( u32RetCode, b6RetType ) \
                        ((b6RetType = (u32RetCode / 0x01000000);  \
                          b6RetType = (b6RetType BITAND 
0x0000003f)))[\c]


dieses makro soll den Return type aus dem Return Code auslesen und 
zurück geben ist das richtig ?

der compiler gibt mir folgende error meldung

../main.c:934: error: expected ')' before ';' token

bei folgenden aufruf

[c]if (U_F_GET_RET_TYPE (oRetCode, b6RetType) == 
U_RESRC_RESULT_BUFFER_ERR)[\c]

von Klaus W. (mfgkw)


Lesenswert?

Wenn du die Ersetzung mal manuell vornimmst, kommt so etwas raus:
1
if ( ((b6RetType = (oRetCode / 0x01000000); b6RetType = (b6RetType BITAND 0x0000003f)))==U_RESRC_RESULT_BUFFER_ERR)

Und da ist offensichtlich das ; falsch.

Für so etwas kann man den Kommaoperator sinnvoll einsetzen (mit 
ausreichend Klammern).

von Mkay (Gast)


Lesenswert?

Du kannst in C nicht mehrere Anweisungen in if-Abfragen durchführen 
lassen, die durch ein Simikolon getrennt sind. Spalte es auf und mach
1
type res1 = U_F_GET_RET_TYPE (oRetCode, b6RetType);
2
if (res1 == U_RESRC_RESULT_BUFFER_ERR)

von U.R. Schmitt (Gast)


Lesenswert?

Ausserdem solltest Du übergebene 'Variablen' IMMER im Makrorumpf 
klammern.

Denn wenn Du beim Benutzen einen zusammengesetzten Ausdruck für eine 
Variable nimmst können sonst lustige Dinge passieren.

Beispiel:
#define MUL(x,y) (x * y)
und
MUL(2+2, 1+3)

Was kommt dabei raus? Gewünscht wäre 4*4 = 16.
Probiere mal aus was tatsächlich rauskommt und dann ändere das Makro auf

#define MUL(x,y) ((x) * (y))

Gruß und Spass

von U.R. Schmitt (Gast)


Lesenswert?

Noch was,
man kann C-Compiler immer dazu bringen, daß sie nach dem Präprozessor 
(das ist der 'Auswerter' für includes und Makros) eine Datei erzeugen.
Schau Dir bei Zweifel ob und wie Makros funktionieren diese Datei mal 
an, da siehst Du dann wie Dein Makro ersetzt wurde.

von hans (Gast)


Lesenswert?

danke für die hilfreichen antworten

von Karl H. (kbuchegg)


Lesenswert?

Zu guter letzt:
Mit Funktionen fährt man immer auf der sicheren Seite und meistens um 
keinen Deut schlechter als mit Makros.
Im Zweifelsfall lieber eine Funktion machen als dasselbe mit Makros zu 
erreichen zu versuchen.

von Klaus W. (mfgkw)


Lesenswert?

... und mit inline auch nicht langsamer (es sei denn, das Makro
würde unvermutet etwas ganz anderes als die Funktion machen,
dann könnte es evtl. schneller sein)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.