Являются ли переменные, объявленные в main.cpp, статическими, экземплярами или...?
Предположим, вы только что создали новый проект 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++, или я буду просто создавать реальные или потенциальные проблемы ради интеллектуальных упражнений и идеологии?
@Bitbang3r, 👍0
Обсуждение2 ответа
Лучший ответ:
В Arduino IDE setup
и loop
являются функциями, а не экземплярами чего-либо.
В последовательность компиляции включен файл main.cpp, который имеет следующий код (здесь немного упрощенный):
#include <Arduino.h>
int main(void)
{
init();
setup();
for (;;) {
loop();
}
return 0;
}
Итак, вы можете видеть, что этот кусочек «сахара»; в основном вызывает setup
один раз и loop
повторно.
Другая функция, init
, инициализирует некоторые аппаратные средства, например таймеры, чтобы millis()
и delay()
работали, как описано в документации. .
Я не могу говорить за другие IDE, но предполагаю, что они делают то же самое, чтобы быть совместимыми.
Все, что вы определяете вне любой функции, будет глобальным, статическим — оно будет существовать на протяжении всего времени выполнения программы — и будет видимым для всех модулей компиляции, которые связаны с конечным исполнительным модулем.
Если вы также включите объявление static перед типом, переменная будет статической на уровне файла, то есть она будет видна только внутри текущего файла.
Это стандартное поведение C/C++ для любого типа данных — скаляры; векторы, структуры и & массивы; и объекты (конечно, только C++).
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
общественные и частные предназначены для занятий. 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