Czytam takie definicje jak
const int ledPin = 9;
i również
#define ledPin 9
Wiem, że taka definicja
int ledPin = 9;
jest złą praktyką, jeśli nie zamierzasz tego zmieniać (czego zwykle nie robisz), chociaż widziałem to kilka razy w programach Arduino. Który z pozostałych dwóch jest preferowany?
źródło
const int
?const int ledPin = 9;
jest preferowany w porównaniu z 2 innymi opcjami. To NIE przydzieli pamięci dla wyjątku,int
chyba że zdefiniujesz gdzieś wskaźnik, czego nikt by nie zrobił.Ściśle mówiąc,
#define
podejście zużyje nieco mniej pamięci. Różnica jest zwykle niewielka. Jeśli musisz zmniejszyć zużycie pamięci, inne optymalizacje byłyby prawdopodobnie znacznie bardziej skuteczne.Argumentem przemawiającym za użyciem
const int
jest bezpieczeństwo typu . Ilekroć odwołujesz się do tego numeru PIN według zmiennej, wiesz dokładnie, jaki typ danych otrzymujesz. Może być promowany / konwertowany pośrednio lub jawnie przez kod, który go używa, ale powinien zachowywać się w bardzo jasny sposób.Natomiast wartość w
#define
jest otwarta na interpretację. W przeważającej większości przypadków prawdopodobnie nie spowoduje to żadnych problemów. Musisz tylko zachować ostrożność, jeśli masz kod, który przyjmuje założenia dotyczące rodzaju lub wielkości wartości.Osobiście prawie zawsze wolę bezpieczeństwo typu, chyba że mam bardzo poważną potrzebę oszczędzania pamięci.
źródło
Prawdopodobnie najlepszym sposobem byłoby
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
lub
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
Nazwa jest pisana wielkimi literami, zgodnie z ogólną praktyką w C ++ (i innych) do nazywania stałych. Nie powinno to zużywać pamięci RAM jako takiej i zużywać około 1 bajta pamięci programu na użycie.
Jednak nie może być problemy, gdy liczba jest wyższa niż 127 i jest przedłużony podczas logowania promowane coraz większych podpisanych liczb całkowitych (nie do końca pewien na ten temat), mimo że jest mało prawdopodobne z numerami pinów.
źródło
Nie tylko będzie
zajmują pamięć RAM, ale w tym przypadku zużyje więcej pamięci RAM, niż jest to konieczne, ponieważ
digitalWrite(uint8_t, uint8_t)
wymaga tylko argumentów jednobajtowych, a int to zwykle dwa bajty (zależne od kompilatora, ale typowe). Zauważ, że możesz podać literałowi jawny typ w #define:chociaż w kontekście, takim jak argument funkcji, w którym wymagany jest określony typ (ponieważ funkcja została odpowiednio prototypowana!), zostałby albo niejawnie rzutowany, albo otrzymałby komunikat o błędzie, jeśli typy nie pasują.
źródło