«LOW» определяется как «0», а «HIGH» определяется как «1» — является ли это частью внешней спецификации?

Arduino.h определяет LOW как 0x0 и HIGH как 0x1. Собирается ли API Arduino раскрыть этот факт? Гарантирует ли это, что так будет всегда?

Другими словами, какова предполагаемая цель этих констант манифеста: LOW и HIGH?

  • Это чисто косметическая мнемоника, добавленная в качестве альтернативы 0/1 и false/true, для тех, кому нравится LOW/HIGH лучше?

  • Или это попытка абстрагировать/изолировать исходный код пользователя от фактического представления LOW и HIGH (например, в случае изменения представления в будущее)?

Основная причина этого вопроса – выяснить, похож ли код

digitalWrite(some_pin, true);
digitalWrite(some_other_pin, !digitalRead(some_other_pin));

это хорошая практика программирования. (Если LOW и HIGH предназначены для абстрагирования пользовательского кода от их фактических значений, то такой код определенно является плохой практикой программирования.)

, 👍2

Обсуждение

Разве не может быть и то, и другое?, @jose can u c

@jose can uc: Могло бы. Но по-настоящему решающим моментом здесь является то, будет ли ответ на *второй* вопрос «да»., @AnT

Глядя на предшественника платформы Arduino, [WConstants.h](https://github.com/WiringProject/Wiring/blob/da0b6b9282ae6a3f047235b5a91b6df567fdf22f/framework/cores/Common/WConstants.h#L39), похоже, имеет закомментированный 0xFF как потенциальное определение HIGH, поэтому пункт 2 может иметь место..., @jose can u c


1 ответ


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

4

Основная причина этого вопроса – выяснить, похож ли код

digitalWrite(some_pin, true);
digitalWrite(some_other_pin, !digitalRead(some_other_pin));

это хорошая практика программирования. (Если LOW и HIGH предназначены для абстрагирования пользовательского кода от их фактических значений, то такой код определенно является плохой практикой программирования.)

Строго говоря, нет, это нехорошая практика программирования.

digitalRead() возвращает int. digitalWrite() ожидает int. Использование ! преобразует int в bool, а затем снова преобразует его в int.

Фактически, API ядра Arduino «следующего поколения» меняет HIGH и LOW с простого int на enum — и это затрудняет приведение через bool вот так:

typedef enum {
  LOW     = 0,
  HIGH    = 1,
  CHANGE  = 2,
  FALLING = 3,
  RISING  = 4,
} PinStatus;

Вы можете увидеть проблемы, которые вызывают здесь.

,