www.mikrocontroller.net

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


Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Ersetzung mal manuell vornimmst, kommt so etwas raus:
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).

Autor: Mkay (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
type res1 = U_F_GET_RET_TYPE (oRetCode, b6RetType);
if (res1 == U_RESRC_RESULT_BUFFER_ERR)

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die hilfreichen antworten

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.