Синтаксис двоичных констант
Я пытался скомпилировать код Arduino на ПК для тестирования, когда заметил странный синтаксис числовых двоичных констант.
Конвенция, похоже, объявляет их так:
static const uint8_t smiley[] = {
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100 };
Однако, когда я пытаюсь скомпилировать это с помощью g++, я получаю
ошибка: «B00111100» не была объявлена в этой области
Теперь, когда я меняю это на B
на стандартный префикс C/C++ 0B
, это работает, но я не хочу менять код, который хочу, поэтому имитирую !
Есть ли здесь какая-то хитрая макро-магия?
@user1273684, 👍2
1 ответ
Лучший ответ:
Существует файл (binary.h), в котором все возможные перестановки чисел от 0 до 255 представлены в двоичном виде. Они хранятся как макросы препроцессора C:
#define B0 0
#define B00 0
#define B000 0
#define B0000 0
#define B00000 0
#define B000000 0
#define B0000000 0
#define B00000000 0
#define B1 1
#define B01 1
#define B001 1
#define B0001 1
#define B00001 1
#define B000001 1
#define B0000001 1
#define B00000001 1
#define B10 2
#define B010 2
#define B0010 2
#define B00010 2
#define B000010 2
#define B0000010 2
#define B00000010 2
... etc ...
Почему Arduino решил это сделать, остается только догадываться. Как вы видели, это непереносимый код.
Лично я никогда не использую (и никогда не рекомендую использовать кому-либо еще) эти макросы, а вместо этого использую стандартное двоичное буквальное представление GCC 0b. ...
.
- Зачем использовать переменную int для вывода, когда const int, enum или #define имеют гораздо больше смысла
- #define выше static const int?
- Почему выходит ошибка: invalid conversion from 'const char*' to 'char' [-fpermissive]??
- Список препроцессоров платы Arduino #defines
- Определить, определены ли Serial1 и Serial2, во время компиляции
- Считается ли #ifdef __SD_H__ плохой практикой?
- Конкатенации строк и символов
- Оптимизация скорости с использованием const, static, constexpr и т. д. в функции
1/2 елки... лол, @jsotola
Причина, по которой они это сделали, заключается в том, что на момент запуска Arduino у GCC не было двоичного представления. Теперь макросы все еще должны присутствовать, чтобы не повредить старый код, написанный с их использованием. На данный момент я согласен с тем, что людям следует использовать стандартное двоичное представление. Да, существуют древние версии IDE, в которых этот код не компилируется, но вы можете пойти дальше только с обратной совместимостью., @per1234
@jsotola Половина рождественской бинарной елки ;), @Majenko