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 vs неподписаний char та Коли isint8_t igned неподписаний char? .
Інший коментатор припустив, що використання байту не обов’язково покращить продуктивність, оскільки числа, менші, ніж 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 рядків далі в коді, це не очевидно, що проблема полягає в тому, як визначається світлодіод.
Я бачив, як люди падають за це багато разів (в тому числі і я).