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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.