Как я могу найти размер инициализатора в C? - PullRequest
2 голосов
/ 02 мая 2019

Я пытаюсь определить список, который включает MAC-адреса наших устройств. И я хотел бы сделать это с помощью макроса. Вот пример списка, который я определил:

#define WHITELIST_DEVICE {                                  \
                      {0x45,0x11,0xDF,0xED,0x2B,0x61},  \
                      {0xAB,0x11,0xDF,0x61,0x6B,0x2B},  \
                      {0x61,0x6B,0x3B,0xED,0x61,0x61},  \
                      {0xDF,0x55,0xDF,0x6B,0x6B,0x61},  \
                     } /**< List of device mac addresses in whitelist*/

После определения списка я хотел бы собрать его размер в виде столбцов и строк. Какой самый простой способ сделать это? Вы также можете предложить мне новый способ определения списка. Код будет работать на встроенной системе. Таким образом, у него не должно быть тяжелых алгоритмов:)

1 Ответ

6 голосов
/ 02 мая 2019

Предполагая, что столбцов всегда шесть, вы можете выполнить вычисление, используя вышеуказанный инициализатор в составном литерале.

#define WHITELIST_DEVICE_LENGTH ( sizeof ((int[][6])WHITELIST_DEVICE) / sizeof ((int[][6])WHITELIST_DEVICE[0]) ) 

или

#define WHITELIST_DEVICE_LENGTH ( sizeof ((int[][6])WHITELIST_DEVICE) / sizeof (int[6]) /* a "row" */ ) 

(int[][6])WHITELIST_DEVICE - обычно создает анонимный объект в области видимости, в которой он появляется. Но когда литерал является операндом sizeof (вариант выражения), он не создает никакого объекта, а только выполняет вычисления для типов в вопрос во время компиляции.

Уловка sizeof для получения размера массива не нуждается в объяснении, я надеюсь. Это также делает выбор int в качестве элемента массива нематериальным, поскольку этот размер будет отменен при делении. Я выбрал этот тип, чтобы избежать возможных проблем с вашими литеральными числами, не помещающимися в элементы массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...