Makro bitte überprüfen!

Gast #1882141
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]
#1882161
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).
Gast #1882167
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)
Gast #1882183
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
Gast #1882188
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren