const int led = 13;
Это правильный метод. Или даже:
const byte led = 13;
Сколько у тебя булавок?
Некоторые учебные пособия не прошли такой контроль качества, как могли бы.
Производительность будет лучше при const byte
сравнении, int
хотя компилятор может быть достаточно умен, чтобы понять, что вы делаете.
Что вы можете сделать, так это мягко побудить людей использовать более эффективные методы, используя их в своем собственном коде.
Ответы на комментарии
Комментатор предположил, что byte
это не стандартный C. Это правильно, однако это сайт Arduino StackExchange, и я считаю, что использование стандартных типов, предоставляемых Arduino IDE, приемлемо.
В Arduino.h есть эта строка:
typedef uint8_t byte;
Обратите внимание, что это не совсем то же самое, что unsigned char
. Смотрите uint8_t против неподписанного символа и когда uint8_t ≠ без знака? ,
Другой комментатор предположил, что использование байта не обязательно улучшит производительность, потому что числа int
будут меньше, чем будут повышаться int
(см. Правила продвижения по целочисленным значениям, если вы хотите узнать больше об этом).
Однако в контексте идентификатора const компилятор в любом случае сгенерирует эффективный код. Например, разборка «мерцание» дает это в первоначальном виде:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
На самом деле он генерирует тот же код, будь то 13
:
- Это буквальный
- Это
#define
- Это
const int
- Это
const byte
Компилятор знает, когда он может поместить число в один регистр, а когда нет. Однако хорошей практикой является использование кодировки, которая указывает на ваши намерения . Делая это const
ясно, что число не изменится, и делая это byte
(или uint8_t
) ясно, что вы ожидаете небольшое число.
Смущающие сообщения об ошибках
Другой важной причиной, по которой следует избегать, #define
являются сообщения об ошибках, которые вы получаете, если допустили ошибку. Рассмотрим этот «мигающий» набросок с ошибкой:
#define LED = 13;
void setup() {
pinMode(LED, OUTPUT); // <---- line with error
}
void loop() {
digitalWrite(LED, HIGH); // <---- line with error
delay(1000);
digitalWrite(LED, LOW); // <---- line with error
delay(1000);
}
На первый взгляд все выглядит хорошо, но генерирует эти сообщения об ошибках:
Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token
Вы смотрите на первую выделенную строку (строка 4) и даже не видите символ «=». Плюс линия выглядит нормально. Теперь совершенно очевидно, в чем здесь проблема ( = 13
заменяется LED
), но когда строка на 400 строк дальше в коде, не очевидно, что проблема в том, как определяется светодиод.
Я видел, как люди падали на это много раз (в том числе и я).