Go Down

Topic: Anfänger Frage: #define (Read 425 times) previous topic - next topic

cGiesen

Hallo Zusammen,

ich bin hier ein absoluter Neuling und oute mich als VB Coder ;)
Da ich mich in das MultiWii Projekt einlese stoße ich auf Probleme, den Code zu verstehen.

Diese Zeile verstehe ich nicht:

  #define LEDPIN_PINMODE             pinMode (13, OUTPUT);pinMode (30, OUTPUT);     // Pin 60 (PC7)

Wenn ich die Doku zu #define lese, steht dort, dass es bei #define kein Semikolon geben darf.
Dieser Code ist aber offensichtlich OK.

Wie muss ich diese Zeile also lesen und verstehen?

DANKE
Carsten

ShuftY

hey,

die Zeile ist einfach so zu verstehn das überall wo LEDPIN_PINMODE steht ,durch die Zeile: pinMode (13, OUTPUT);pinMode (30, OUTPUT); eingesetzt wird.

Das mit dem Semikolon ist quasi auf Konstanten bezogen,in deinem Beispielt sind es ja Funktionen.
Wenn du nach einer Konstanten in der Define direktive das Semikolon setzt(#define a 3;) und dann a+b; machst, dann ist das für den Compiler nicht zu lesen, weil das ; das ende eines Befehl angibt. Es steht also für den Compiler:
3;
+b;

Was ist denn +b ?!?!?!

Und deswegen geht das so nicht ;D

hoffe konnte das aufklären

gruß

ShuftY

michael_x

#2
Jul 31, 2012, 10:19 am Last Edit: Jul 31, 2012, 03:53 pm by michael_x Reason: 1
Quote
Wie muss ich diese Zeile also lesen und verstehen?


Wie es zu lesen ist, hat ShuftY richtig beschrieben.
Zu verstehen ist das als ein Beispiel für Missbrauch von c Syntax.

Der Sinn liegt evtl. darin, dass in der #define Anweisung die 13 und 30 am Anfang der Datei oder in einer speziellen Definitions-Include Datei leichter zu finden ( und evtl. anzupassen ) sind, als da wo irgendwo im folgenden Code ein mysteriöses
LEDPIN_PINMODE
steht.

"Das mit dem Semikolon" könnte man auch so machen, dass
#define LEDPIN_PINMODE             pinMode (13, OUTPUT);pinMode (30, OUTPUT)    // Pin 60 (PC7) (ohne Semikolon am Ende)

später als

  LEDPIN_PINMODE;  // sieht schon fast wie c aus

verwendet wird.
( Ein Semikolon zu viel schadet hier übrigens nicht, und ist syntaktisch erlaubt )

voithian

#3
Jul 31, 2012, 11:50 am Last Edit: Jul 31, 2012, 11:57 am by voithian Reason: 1

"Das mit dem Semikolon" könnte man auch so machen, dass
#define LEDPIN_PINMODE             pinMode (13, OUTPUT);pinMode (30, OUTPUT)    // Pin 60 (PC7) (ohne Semikolon am Ende)

später als

  LEDPIN_PINMODE;  // sieht schon fast wie c aus

verwendet wird.
( Ein Semikolon zu viel schadet hier übrigens nicht, und ist sytaktisch erlaubt )


Wobei zu bemerken wäre, dass im Sourcecode (Datei MultiWii_2_1.ino) in der Funktion setup() LEDPIN_PINMODE tatsächlich mit einem abschließenden Semikolon verwendet wird (zusätzlich zu dem Semikolon im #define in def.h) und somit ein überflüssiges Semikolon aus dem Präprozessor herauskommt.
Wie schon von michael_x gesagt ist ein einzelnes Semikolon syntaktisch zulässig (leere Anweisung) und der C/C++-Compiler wird es hoffentlich wegoptimieren.

Nichtsdestotrotz ist es für jemand, der genau hinschaut verwirrend und man sollte meiner Meinung nach entweder in MultiWii_2_1.ino das Semikolon hinter LEDPIN_PINMODE weglassen oder besser in def.h das Semikolon weglassen und stattdessen in MultiWii_2_1.ino das Semikolon hinter LEDPIN_PINMODE setzen (sieht irgendwie natürlicher aus).

Go Up