что является хорошей практикой при инициализации переменных

Должны ли переменные инициализироваться при объявлении или в функции установки? Безопасно предположить, что компилятор инициализируется?

логическое значение x; --- инициализировать здесь true/false? Пустая установка () . . --- или инициировать здесь? .

void loop() Если (x) --- состояние x неизвестно, если оно не инициализировано.

, 👍0


2 ответа


1

Инициализировать глобальную переменную уместно, если вы заранее знаете, что при запуске она всегда должна иметь заданное значение. Компилятор создаст образ глобальных переменных в ПЗУ, который будет скопирован в ОЗУ перед выполнением любого кода.

Можно предположить, что компилятор инициализируется?

Компилятор инициализируется значением 0, глобальным значением, которое вы специально не инициализировали. Давайте возьмем случай вашего логического значения. «0» означает «ложь», верно? Таким образом, «x» предварительно инициализируется как «false». Но я, как читатель (или вы сами, шесть месяцев спустя), возможно, не знаю, намеревались ли вы инициализировать это значение «false» (значение по умолчанию) или забыли инициализировать его. Указание значения «false» может не иметь никакого другого эффекта на код, но оно информирует меня или вас в будущем о том, что вы имели в виду установку «false» при запуске. Помните, что ваш код взаимодействует с людьми так же, как и с компилятором. Напишите это так, чтобы вы или я могли не только понять это, но и не смогли понять неправильно.

Если вы инициализируете его в setup(), компилятор сгенерирует код в setup() специально для этого. Если функция setup() должна решить во время запуска, каким должно быть начальное значение этой переменной, то это место для этого. В противном случае дополнительный код просто займет место во Flash. Это не более вредно, чем трата этих нескольких дополнительных байтов кода, но это не дает ничего большего, чем позволить сделать это глобальному образу.

Что бы вы ни делали или не делали с 'x' во время загрузки или в 'setup()', это сохранится в 'loop()', так что состояние 'x не будет неизвестным, когда вы туда доберетесь. (Если я неправильно понял эту часть вашего вопроса, отредактируйте ее в своем вопросе.)

,

Я не удивлюсь, если компилятор достаточно умен, чтобы увидеть, что переменная не читается до того, как она будет «инициализирована» в вашей функции настройки, и пропустить собственную 0-инициализацию (то есть, создавая идентичный код, независимо от того, инициализируется глобально или внутри функции настройки), @Gerben

Я только что проверил, и инициализация переменной внутри setup создает немного больший скетч., @Gerben

Предположительно потому, что setup() похожа на любую другую функцию и может быть вызвана в любое время. Ожидается, что глобальная инициализация будет выполнена к моменту выполнения любого пользовательского кода., @JRobert


0

На самом деле нужно следовать только одному правилу:

Никогда не читайте переменную перед записью в нее определенного значения.

Вам не нужно явно писать в переменную, потому что язык C++ различает два типа переменных:

  • Статические переменные инициализируются всеми нулевыми битами, если не выполняется явная инициализация.
  • Автоматические переменные никогда не инициализируются автоматически. Их начальное значение соответствует ячейкам памяти, которые они занимают, если не выполняется явная инициализация.

Статические переменные определяются вне какой-либо функции или метода или с помощью ключевого слова static.

Автоматические переменные — все остальные.

Пример:

static int s1; // статично, инициализировано 0
int s2 = 42; // статично, инициализировано значением 42

void setup() {
    int a1; // автоматически, имеет неизвестное начальное значение
    static int s3; // статично, инициализировано 0
}

void your_function() {
    static int s4 = 23; // статично, инициализировано значением 23
    int a2 = 7; // автоматически, инициализируется значением 7 каждый раз, когда сюда приходит поток управления
}

Все статические переменные инициализируются ровно один раз перед вызовом main(). Или, в случае Arduino, перед вызовом setup() или любого другого метода или функции.


О, еще одно очень важное правило: Знай, что делаешь, не гадай, будь уверен.

Возможно, вам стоит прочитать стандарт или хотя бы какую-нибудь хорошую книгу.

Если вы используете какую-то редкую функцию, сделайте ее явной или прокомментируйте.


Дополнительные примечания:

Ардуино использует C++. Это действительно другой язык, чем C.

Вы можете думать о main() как:

void main() {
    setup();
    for (;;) {
        loop();
    }
}
,