+2 голосов
В разных примерах видел объявление констант по-разному. Где-то #define, а где-то const int. Есть ли между ними разница, и какой способ более предпочтительный?
(905 баллов) 3 35 80

2 Ответы

+1 голос
 
Лучший ответ

Исчерпывающий ответ на вопрос есть тут
Если коротко - то для const действуют области видимости, есть тип, и по сути это обычные переменные доступные только для чтения - поэтому там где нужно именно число которое не должно меняться ни при каких условиях я бы использовал именно const int.
 #define ценен с директивами #if, #elif, #else и #endif когда необходимо управлять компиляцией частей исходного файла. Например этот оператор можно использовать чтобы один и тот же код компилировался для разных платформ Ардуино.

Пример:

#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)

#define LedPinOut() DDRB  |= (1<<5)
#define LedPinOn()  PORTB |= (1<<5)
#define LedPinOFF() PORTB &= (~(1<<5))

// Arduino Mega
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

#define LedPinOut() DDRB  |= (1<<7)
#define LedPinOn()  PORTB |= (1<<7)
#define LedPinOFF() PORTB &= (~(1<<7))

// Leonardo
#elif defined(__AVR_ATmega32U4__)

#define LedPinOut() DDRC  |= (1<<7)
#define LedPinOn()  PORTC |= (1<<7)
#define LedPinOFF() PORTC &= (~(1<<7))

// anything else
#else
#error "Board not supported"
#endif

LedPinOut() - порт на котором находится встроенный светодиод как выход
LedPinOn() - зажечь встроенный светодиод
LedPinOFF() - погасить встроенный светодиод
Данные макросы будут работать на платформах Uno(Nano), MEGA, Leonardo

(1.2 тыс. баллов) 2 10 38
выбран
–1 голос
Если кратко и просто. То #define вставляет на уровне компилятора ваш текст . Подобные "константы" не используют оперативную память    . А вот const уже используют. Можно сказать , что для ардуино с её небольшой оперативной памятью и не сложными программами лучше использовать define.
(1.2 тыс. баллов) 2 9 28
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. parovoZZ

    8 балл(ов)

  2. dmipec

    2 балл(ов)

  3. wickiup

    2 балл(ов)

  4. Un_ka

    2 балл(ов)

  5. antonlewz

    1 балл(ов)

  6. Алексей1307

    1 балл(ов)

Награды месяца
1-е место: Arduino MKR GSM 1400
2-е место: Arduino MKR Wi-Fi 1010
3-е место: Arduino MKR Zero

...