Синтаксис двоичных констант

Я пытался скомпилировать код Arduino на ПК для тестирования, когда заметил странный синтаксис числовых двоичных констант.

Конвенция, похоже, объявляет их так:

    static const uint8_t smiley[] = {
        B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10100101,
        B10011001,
        B01000010,
        B00111100 };

Однако, когда я пытаюсь скомпилировать это с помощью g++, я получаю

ошибка: «B00111100» не была объявлена в этой области

Теперь, когда я меняю это на B на стандартный префикс C/C++ 0B, это работает, но я не хочу менять код, который хочу, поэтому имитирую !

Есть ли здесь какая-то хитрая макро-магия?

, 👍2


1 ответ


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

4

Существует файл (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. ....

,

1/2 елки... лол, @jsotola

Причина, по которой они это сделали, заключается в том, что на момент запуска Arduino у GCC не было двоичного представления. Теперь макросы все еще должны присутствовать, чтобы не повредить старый код, написанный с их использованием. На данный момент я согласен с тем, что людям следует использовать стандартное двоичное представление. Да, существуют древние версии IDE, в которых этот код не компилируется, но вы можете пойти дальше только с обратной совместимостью., @per1234

@jsotola Половина рождественской бинарной елки ;), @Majenko