Ich lese Definitionen wie
const int ledPin = 9;
und auch
#define ledPin 9
Ich weiß, dass eine Definition wie
int ledPin = 9;
ist eine schlechte Praxis, wenn Sie es nicht ändern werden (was Sie normalerweise nicht tun werden), obwohl ich dies mehrmals in Arduino-Programmen gesehen habe. Welches der beiden anderen wird bevorzugt?
quelle
const int
?const int ledPin = 9;
wird gegenüber 2 anderen Optionen bevorzugt. Dies wird KEINEN Speicher für ein reservieren,int
außer wenn Sie irgendwo einen Zeiger darauf definieren, was niemand tun würde.Genau genommen wird der
#define
Ansatz etwas weniger Speicher verbrauchen. Der Unterschied ist normalerweise jedoch winzig. Wenn Sie die Speichernutzung reduzieren müssen, sind andere Optimierungen wahrscheinlich weitaus effektiver.Ein Argument für die Verwendung
const int
ist die Typensicherheit . Wo immer Sie sich per Variable auf diese PIN-Nummer beziehen, wissen Sie genau, welchen Datentyp Sie erhalten. Es kann implizit oder explizit durch den Code, der es verwendet, beworben / konvertiert werden, sollte sich jedoch sehr klar verhalten.Im Gegensatz dazu ist der Wert in a
#define
interpretationsfähig. Die überwiegende Mehrheit der Zeit wird es Ihnen wahrscheinlich überhaupt keine Probleme bereiten. Sie müssen nur ein wenig vorsichtig sein, wenn Sie Code haben, der Annahmen über den Typ oder die Größe des Werts macht.Persönlich bevorzuge ich fast immer die Typensicherheit, es sei denn, ich muss dringend Speicherplatz sparen.
quelle
Wahrscheinlich wäre der beste Weg
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
oder
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
Der Name ist in Großbuchstaben gemäß der allgemeinen Praxis in C ++ (und anderen), um Konstanten zu benennen. Dies sollte keinen RAM an sich verwenden und ungefähr 1 Byte Programmspeicher pro Verwendung verwenden.
Es kann jedoch zu Problemen kommen, wenn die Zahl höher als 127 ist und das Vorzeichen erweitert wird, während auf größere vorzeichenbehaftete Ganzzahlen umgestellt wird (diesbezüglich nicht ganz sicher), obwohl dies bei PIN-Nummern unwahrscheinlich ist.
quelle
Nicht nur wird
Nehmen Sie RAM in Anspruch, verwenden Sie in diesem Fall jedoch mehr RAM als erforderlich, da
digitalWrite(uint8_t, uint8_t)
nur Ein-Byte-Argumente erforderlich sind und ein Int normalerweise zwei Bytes umfasst (compilerabhängig, aber typisch). Beachten Sie, dass Sie dem Literal in #define einen expliziten Typ geben können:In einem Kontext wie einem Funktionsargument, in dem ein bestimmter Typ erforderlich ist (weil die Funktion ordnungsgemäß prototypisiert wurde!), wird sie entweder implizit umgewandelt oder es wird eine Fehlermeldung angezeigt, wenn die Typen nicht übereinstimmen.
quelle