Союзы C ++, использующие анонимные структуры с наследованием - PullRequest
0 голосов
/ 27 июня 2019

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

Цель состоит в том, чтобы лучше создавать союзы. В стандартных документах, таких как спецификации контроллера USB-C PD, регистры представлены в виде отдельных 8-битных секций.

Спецификация интерфейса контроллера порта универсальной последовательной шины Type-C TM

Когда кодирование соответствует вышеуказанному стандарту, я предпочитаю представлять данные одинаковым образом, а затем помещать абстракции поверх стандарта.

Например, есть регистры с именами ALERT_H и ALERT_L, которые я представляю как две однобайтовые структуры битовых полей (обычная практика для встраиваемых систем).

При создании упрощающей абстракции я хочу объединить две структуры в эквивалентную структуру с объединением, чтобы я мог проверить, установлены ли какие-либо биты в одном операторе if (если (Flags)).

Пример:

#include <cstdint>

struct ALERT_L
{
    uint8_t CC_STATUS : 1;
    uint8_t POWER_STATUS : 1;
    uint8_t RX_SOP_MSG_STATUS : 1;
    uint8_t RX_HARD_RESET : 1;
    uint8_t TX_FAIL : 1;
    uint8_t TX_DISCARD : 1;
    uint8_t TX_SUCCESS : 1;
    uint8_t const ALARM_VBUS_VOLTAGE_H : 1;
};
struct ALERT_H
{
    uint8_t const ALARM_VBUS_VOLTAGE_L : 1;
    uint8_t FAULT : 1;
    uint8_t RXBUF_OVFLOW : 1;
    uint8_t const VBUS_SINK_DISCNT : 1;
    uint8_t Reserved4_7 : 1;
};
/**
  * Helper to group the alert bits into a single struct
  */
union ALERT
{
    struct : ALERT_H, ALERT_L
    {

    };
    uint16_t Value;
};
static_assert(sizeof(ALERT) == sizeof(uint16_t));
static_assert(sizeof(ALERT) == sizeof(ALERT_H) + sizeof(ALERT_L));

Хотя приведенный выше код компилируется, я не могу получить доступ к биту CC_STATUS анонимных структур или любому другому, я не понимаю, почему я что-то не так делаю? Есть ли способ, которым я могу представить этот элемент данных без кодирования геттеров и сеттеров.

Я могу добиться этого, используя стандартную композицию, но в результате получается более подробный код, который является более подробным, чем работа с 8-битными структурами, как они есть. В других стандартах также есть случаи, которые делают аналогичную вещь, но имеют 4 байта, что дополнительно стимулирует значение интерфейса.

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

 alert.regs.CC_STATUS

более многословно, чем:

alert.CC_STATUS

Это может быть невозможно в C / C ++, но я думал, что раньше все было невозможно и много раз ошибалось.

...