Я читаю определения как
const int ledPin = 9;
а также
#define ledPin 9
Я знаю, что определение как
int ledPin = 9;
Это плохая практика, если вы не собираетесь ее менять (что обычно не происходит), хотя я видел это несколько раз в программах Arduino. Какой из двух других предпочтительнее?
programming
Йорис Гроусман
источник
источник
const int
?const int ledPin = 9;
предпочтительнее 2 других вариантов. Это НЕ будет выделять память дляint
исключения, если вы где-то определите указатель на него, что никто не сделает.Строго говоря,
#define
подход будет использовать немного меньше памяти. Разница обычно крошечная, хотя. Если вам нужно уменьшить использование памяти, то другие оптимизации, вероятно, будут гораздо более эффективными.Аргумент в пользу использования
const int
- безопасность типов . Где бы вы ни ссылались на этот пин-код по переменной, вы точно знаете, какой тип данных вы получаете. Он может быть продвинут / преобразован неявно или явно кодом, который его использует, но он должен вести себя очень четко.Напротив, значение в a
#define
открыто для интерпретации. В большинстве случаев это, вероятно, не вызовет у вас никаких проблем. Вам просто нужно быть немного осторожнее, если у вас есть код, который делает предположения о типе или размере значения.Лично я почти всегда предпочитаю безопасность типов, если у меня нет очень серьезной необходимости экономить память.
источник
Вероятно, лучшим способом было бы
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
или
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
Имя указано заглавными буквами в соответствии с общей практикой в C ++ (и других) для именования констант. Это не должно использовать какую-либо оперативную память само по себе, и использовать около 1 байта программной памяти на использование.
Однако могут возникнуть проблемы, когда число превышает 127 и увеличивается в знаке при переходе на более крупные целые числа со знаком (не совсем уверен в этом), хотя это вряд ли произойдет с номерами выводов.
источник
Не только будет
занимают ОЗУ, но в этом случае будет использовать больше ОЗУ, чем необходимо, так как
digitalWrite(uint8_t, uint8_t)
нужны только однобайтовые аргументы, а int обычно составляет два байта (зависит от компилятора, но типично). Обратите внимание, что вы можете дать литералу явный тип в #define:хотя в контексте, таком как аргумент функции, где требуется конкретный тип (потому что функция была правильно прототипирована!), он либо будет неявно приведен, либо получит сообщение об ошибке, если типы не совпадают.
источник