В свете последних статей об изменении стандартов C++11 хотел спросить следующий момент. Я не великий спец по C++, пока только изучаю. Столкнулся со следующей задачей, устройство передает информацию о своем состоянии одним байтом, где каждый конкретный бит соответствует определенному параметру. В C/C++ есть очень удобные штуки — union и битовые поля.
По идее для такой задачи он должен выглядить таким образом
union Data
{
struct
{
unsigned int param1 :1;
unsigned int param2 :1;
unsigned int param3 :1;
unsigned int param4 :1;
unsigned int param5 :1;
unsigned int param6 :1;
unsigned int param7 :1;
unsigned int param8 :1;
} params;
unsigned char Byte;
};
Data info;
Тут получается можно записать байт в
info.Byte = 0x21;
а потом работать с параметрами как
info.params.param3 = 1;
Но для большей читабельности кода можно сделать еще и так.
union Data
{
struct
{
unsigned int param1 :1;
unsigned int param2 :1;
unsigned int param3 :1;
unsigned int param4 :1;
unsigned int param5 :1;
unsigned int param6 :1;
unsigned int param7 :1;
unsigned int param8 :1;
};
unsigned char Byte;
};
Data info;
Тогда байт записать можно все также
info.Byte = 0x21;
а вот работать с битами можно уже более понятным и простым способом
info.param3 = 1;
Второй вариант мне чисто эстетически нравится больше, но терзают смутные сомнения относительно его соответствии стандартам. Возможно ли использование анонимных структур вот в таких объединениях?
Буржуи на форумах вроде как говорят, что это не есть гут, но при этом тот-же GCC компилирует этот код без ворнингов и все работает как и положено.
Подскажите возможно ли такое использование или это исключительно фича GCC и соответственно компиляторо-зависимый код получается?