int, const и #define

Тема в разделе "Флудилка", создана пользователем SIGN, 23 ноя 2015.

  1. SIGN

    SIGN Нуб

    Помогите разобраться. Я новичок.
    В чем разница между int, const и #define ...
    Вот примеры, и все работает:
    Код (C++):
    int LED_PIN = 9;
    int POT_PIN = 0;

    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(POT_PIN,INPUT);
    }

    void loop()
    {
      int rotation, brightness;
      rotation = analogRead(POT_PIN);
      brightness = rotation / 4;
      analogWrite(LED_PIN, brightness);
    }
     
    Код (C++):
    #define LED_PIN  9
    #define POT_PIN  A0

    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(POT_PIN,INPUT);
    }

    void loop()
    {
      int rotation, brightness;
      rotation = analogRead(POT_PIN);
      brightness = rotation / 4;
      analogWrite(LED_PIN, brightness);
    }
     
    Что за что отвечает?
     
  2. AlexU

    AlexU Гуру

    int (и остальные типы) -- переменная, которой выделяется место в оперативной памяти (в контексте AVR такая память называется SRAM -- её очень мало, если есть возможность, то лучше определить константой через #define или const).
    #define -- директива препроцессору, перед компиляцией препроцессор пройдется по всем исходникам и заменит переменную на значение.
    const int (и остальные типы с модификатором const) -- константа определенного типа, результат зависит от компилятора и опций сборки. Но в большинстве случаев Вы не заметите разницы между #define или const (дело вкуса, что использовать).

    PS: утверждения справедливы для С/С++ компиляторов из семейства GCC (хотя, наверно, можно применить и в отношении других С/С++ компиляторов)
     
    vvr и nailxx нравится это.
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Содержимое переменных (int, byte, long, float) можно изменить в ходе работы программы. Например, присвоить переменной temp значение 23,6 с датчика температуры.

    Константы изменять нельзя. Вообще нельзя. Табу. Их значение всегда такое, как присвоено в скетче. Например, размеры знакоместа для LCD дисплея: width = 16; height = 2;

    #define это синоним, для удобства программиста. Может быть не только числом, но и любым куском кода. При компиляции (переводу скетча в бинарный код) компилятор тупо меняет такой синоним на его содержимое. К примеру, объявление в начале скетча:
    Код (C++):
    #define BUTTON_PIN 4 // пин для кнопки
    #define SENSOR_PIN 5 // пин для магнитного датчика
    #define SIREN_PIN 8 // пин для транзистора, подключенного к сирене
    #define BUTTON_PRESSED (digitalRead(BUTTON_PIN)) // проверка нажатия кнопки
    #define SENSOR_ACTIVE (digitalRead(SENSOR_PIN)) // проверка датчика на двери
    #define SIREN_ON (digitalWrite(SIREN_PIN, HIGH)) // подаем питание на сирену
    #define SIREN_OFF (digitalWrite(SIREN_PIN, LOW)) // подаем питание на сирену
     
    позволит написать такой легкочитаемый даже через 3 года код:
    Код (C++):
    if (SENSOR_ACTIVE) SIREN_ON;
    if (BUTTON_PRESSED) SIREN_OFF;
    вместо классического:
    Код (C++):
    if (digitalRead(5))
    {
      digitalWrite(8, HIGH);
    }

    if (digitalRead(4))
    {
      digitalWrite(8, LOW);
    }
    Еще с помощью #define можно реализовать режим отладки - когда используется вывод нужных значений переменных в консоль, а при нормальной работе устройства, когда это режим отключен, в консоль ничего не выводится, и даже память не занимается неиспользуемыми библиотеками.
     
    ForestCrow и Sparkfire нравится это.
  4. geher

    geher Гуру

    #define - это макрооопределение, позволяющее заменять объемный фрагмент кода более простой конструкцией. Причем в макроопределении можно использовать параметры.
    Константы - самое простое, но не единственное применение макроопределений.
    Например, можно сделать так:
    Код (C):

    #define WRITE_TO_SERIAL(text,val) {Serial.print(text); \
      Serial.print(": "); \
      Serial.println(val);}

     
    а потом, вместо того, чтобы повторять эту конструкцию, использовать такое:
    Код (C):

      WRITE_TO_SERIAL("text",122);
     
    ,
    чтобы вывести значение с описанием.
    Это получается аналогично использованию inline функций, т.е. таких, которые не вызываются, а код их подставляется при компиляции в место вызова.
     
    ForestCrow, Sparkfire и Tomasina нравится это.