Работая с низкоуровневым C++ для встраиваемых систем без ПО (STM32), я столкнулся с примером использования объявления "анонимного члена союза" с нетривиальным (структурным) типом. Возможно ли подобное?
Я пробовал следующий вид кода:
struct Specialization_CR1_t
{
uint32_t a :1 ;
uint32_t :31;
};
struct CR1_t
{
union
{
struct
{
uint32_t : 1;
uint32_t b: 1;
uint32_t :30;
} ;
// Few tries...
// Specialization_CR1_t {};
// Specialization_CR1_t;
Specialization_CR1_t () ;
// Fails with "expected unqualified-id before ')'"
};
};
int main()
{
//The goal :
struct CR1_t CR1;
CR1.a = 1;
CR1.b = 0;
}
Цель состоит в том, чтобы избежать CR1.<thing>.a
. Очевидно, что есть возможность напрямую объявить Specialization_CR1_t
анонимно в union
, однако конечная цель состоит в том, чтобы иметь возможность использовать шаблон и tmpl_CR1_t
вместо "просто" Specialization_CR1_t
.
Я знаю о потенциальных проблемах с памятью из-за материалов, отображаемых здесь. Однако, поскольку это встроенная среда с голым железом, структура памяти полностью известна, биты упакованы хорошо и плотно, а цепочка инструментов исправлена (без проблем с битовыми полями).
Более того, поскольку эта структура будет отображаться непосредственно в памяти, я не могу позволить себе накладные расходы на еще одну переменную. Общий размер моей структуры должен быть 32 бита, и запись в a
или b
должна изменить только правильный бит.
С наилучшими пожеланиями !
Specialization_CR1_t
в качестве участника ваш код недействителен. К сожалению, некоторые компиляторы C++ поддерживают это по умолчанию как расширение (возможно, поскольку C делает (?)) - если вы запустите свой компилятор, чтобы выдать больше предупреждений/диагностик (например,-Wall -pedantic
дляgcc
), он, вероятно, скажет вам это. Именование элементов структуры или объединения в любом случае не приводит к дополнительным накладным расходам с точки зрения использования памяти. - person Peter   schedule 28.02.2020Foo
вstruct Foo { <members>};
внутри класса/объединения можно опустить. ИмяInstance
вstruct {<members>} Instance
не может. - person Peter   schedule 29.02.2020