Являются ли переменные, объявленные в main.cpp, статическими, экземплярами или...?

c++

Предположим, вы только что создали новый проект Arduino, используя PlatformIO или IDE, например Sloeber. Теперь у вас есть файл с именем «main.cpp». с двумя функциями (методами?):

  • void setup()
  • void loop()

Теперь предположим, что вы следуете нормам кодирования Arduino и вставляете что-нибудь вверху, например:

hd44780_I2Cexp lcd(0x27);

Является ли объект hd44780_I2Cexp, созданный им, статическим? Или main.cpp #include включен в какой-то класс таким образом, что все в нем становится частными или открытыми членами этого класса?

Если это методы экземпляра, есть ли на 100% гарантия, что экземпляр будет и навсегда останется одноэлементным? Или существует ли какой-либо мыслимый сценарий, в котором могут существовать два одновременных экземпляра (скажем, если вы используете оба ядра ESP32)?

Если это экземпляр, но гарантированно навсегда останется одноэлементным на любой будущей платформе, называющей себя «Arduino», есть ли нужность учитывать различие между «членом экземпляра» и «членом экземпляра»; и «статическая переменная»; (в контексте main.cpp)?

Должен ли main.cpp "действительно" иметь отдельный файл main.h и "official" Блоки public: и private: ради языковой чистоты C++, или я буду просто создавать реальные или потенциальные проблемы ради интеллектуальных упражнений и идеологии?

, 👍0

Обсуждение

общественные и частные предназначены для занятий. main не является классом и не входит в него. Это просто функция. Объект lcd, который вы описываете, находится в глобальной области видимости. Это не часть экземпляра какого-либо класса. Я думаю, может быть, вы путаете это с java., @Delta_G

Созданная вами переменная lcd не является статической и не является переменной экземпляра. Это экземпляр класса hd44780_I2Cexp, который находится в глобальной области видимости. Это не член чего-либо. Это не переменная экземпляра чего-либо. Это не статично. Это просто глобальный объект., @Delta_G

Если вы проверите вывод при сборке в подробном режиме, вы обнаружите упомянутый файл .ino.cpp во временном каталоге. Это результат процесса сборки, [документация для которого](https://arduino.github.io/arduino-cli/0.33/sketch-build-process/), вероятно, расскажет вам все, что вы хотите знать, если нет Файл .ino.cpp — нет., @timemage


2 ответа


Лучший ответ:

0

В Arduino IDE setup и loop являются функциями, а не экземплярами чего-либо.

В последовательность компиляции включен файл main.cpp, который имеет следующий код (здесь немного упрощенный):

#include <Arduino.h>

int main(void)
{
    init();

    setup();
    
    for (;;) {
        loop();
    }
        
    return 0;
}

Итак, вы можете видеть, что этот кусочек «сахара»; в основном вызывает setup один раз и loop повторно.

Другая функция, init, инициализирует некоторые аппаратные средства, например таймеры, чтобы millis() и delay() работали, как описано в документации. .

Я не могу говорить за другие IDE, но предполагаю, что они делают то же самое, чтобы быть совместимыми.

,

0

Все, что вы определяете вне любой функции, будет глобальным, статическим — оно будет существовать на протяжении всего времени выполнения программы — и будет видимым для всех модулей компиляции, которые связаны с конечным исполнительным модулем.

Если вы также включите объявление static перед типом, переменная будет статической на уровне файла, то есть она будет видна только внутри текущего файла.

Это стандартное поведение C/C++ для любого типа данных — скаляры; векторы, структуры и & массивы; и объекты (конечно, только C++).

,