Go Down

Topic: #define bla<-> const bla (Read 968 times) previous topic - next topic

gregorss

Moinmoin!

Ich habe gelernt, dass man statt #define-Zeilen Konstante Variablen benutzen soll.

Jetzt habe ich in fremdem Code haufenweise #defines und keine einzige „const bla"-Zeile vor mir.

Ist das eine Frage des Stils, eine Arduino-Spezialität, oder sonstwas?

Danke vorweg für Kommentare!

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

combie

Das ist der Unterschied zwischen altem C und modernem C++ Stil.
Wir sind mitten in der Übergangszeit.

Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

gregorss

Das ist der Unterschied zwischen altem C und modernem C++ Stil.
Wir sind mitten in der Übergangszeit.
Das passt zur Jahreszeit :-)

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

ElEspanol

#3
Oct 06, 2015, 09:46 am Last Edit: Oct 06, 2015, 09:48 am by ElEspanol
ich dachte immer, dass  z.B.
#define Led 3

im ganzen Sketch das Led gegen 3 austauscht, also aus Ledpin12 wird 3pin12 und das ist möglicherweise nicht was du wolltest.

P.S. bei uns scheint heute die Sonne  :smiley-cool: , aber wir haben auch schon Übergangszeit

combie

Eins der Hauptprobleme von #defines ist, dass sie nicht typisiert sind.

Beides gültig:
Code: [Select]
#define Led 3
#define Led "AffenHintern"



Dieses ist eindeutig:
Code: [Select]
const byte Led = 3;
Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

guntherb

#5
Oct 06, 2015, 12:20 pm Last Edit: Oct 06, 2015, 12:24 pm by guntherb
#define ist eine Compileranweisung

Man kann das auch verwenden.
Ich verwenden ganz gerne:
#define Sek *1000
#define Min *60 Sek

Im Code dann: long Dauer = 5 Min;

Vor dem Comilieren ersetzt der Compiler dann alle "Min" und "Sek", macht also aus obiger Zeile
long Dauer = 5 *60*1000;  (was dann wiederum zu long Dauer = 300000 zusammengesetzt wird)

Aber das ist eben ein reines Text ersetzen. Ohne jegliche Überprüfung. Im Beispiel kann das Sinn machen, weil es wirklich um Text geht und um die Lesbarkeit.

Wenn es wirklich um die Vereinbarung von Zahlenwerten geht, dann ist es meiner Meinung nach besser, const zu benutzen.
const int LEDpin = 6;
Dann werden damit auch sämtliche Typüberprüfungen durchgeführt, wie Combie schon geschrieben hat.

Das ist auch in der Arduino IDE so:
die Pindefinitionen wie z.B. A0, SDA  etc sind per const gelöst,
Begriffe wie INPUT, true etc per #define
Grüße
Gunther

Serenifly

#define ist eine Compileranweisung
Genaugenommen ist #define ist ein Präprozessor-Makro. Der Präprozessor ist heute meistens Teil des Compilers, aber er war früher mal ein völlig eigenständiges Programm.


Wo man #define hauptsächlich sieht ist in den Headers von Bibliotheken. Zum Teil für Konstanten. Zum Teil für Einstellungen. Aber in Sketchen sollte man eher zu const greifen.


const hat auch in C++ noch viele andere Zwecke, die weit über #define hinausgehen. z.B. sind String Literale const. Deshalb sollte man einen Funktions-Parameter der einen C String nimmt, als "const char*" deklarieren und nicht als "char*". Genau zwingt dich der Compiler PROGMEM Konstanten als const zu deklarieren.
Eine sehr wichtige Rolle spielt const dann bei Referenzen auf Objekte. Man kann auch ganze Methoden als const deklarieren. Diese können dann keine Daten ändern und const Objekte können dann nur const Methoden aufrufen. Und Methoden-Signaturen können sich durch const unterscheiden. So kann man const und nicht const Objekte unterschiedlich behandeln.

Go Up