[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]
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).
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) |
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
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.
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.
... 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.