Обратите внимание на следующие «неизменяемые» объявления:
typedef struct T_MESSAGE
{
unsigned int uiTimestamp;
unsigned char ucDataType;
unsigned int uiDataSize;
unsigned char aucData[1024];
} TT_MESSAGE;
typedef struct T_SENSORDATA_HEADER
{
unsigned char ucSensorType;
unsigned char ucMountingPoint;
} TT_SENSORDATA_HEADER;
Если сообщение содержит данные датчика, данные сохраняются в массиве aucData, всегда начиная с заголовка данных датчика.Я хотел бы создать объединение или структуру, которая позволяет мне иметь прямой доступ ко всем членам такого сообщения, не используя другое имя переменной.Я надеюсь, что вы понимаете, что я хочу сделать, посмотрев на мои предыдущие попытки.Я попробовал это так:
union SensorDataMessage
{
struct T_Message;
struct
{
unsigned : 32; // Skip uiTimestamp
unsigned : 8; // Skip ucDataType
unsigned : 32; // Skip uiDataSize
struct T_SENSORDATA_HEADER;
};
};
и это:
struct SensorDataOverlay
{
unsigned : 32; // Skip uiTimestamp
unsigned : 8; // Skip ucDataType
unsigned : 32; // Skip uiDataSize
struct T_SENSORDATA_HEADER;
};
union SensorDataMessage
{
struct T_Message;
struct SensorDataOverlay;
};
Но ничего из этого не работает.В конце я хотел бы написать что-то вроде этого:
int Evaluate(SensorDataMessage msg)
{
unsigned char tmp = msg.ucDataType;
unsigned char tmp2 = msg.ucSensorType;
[...]
}
С здесь Я узнал, что то, что я хочу сделать, должно быть возможным, но только в Visual C:
Расширение Microsoft C позволяет объявлять структурную переменную в другой структуре без указания имени.Эти вложенные структуры называются анонимными структурами.C ++ не допускает анонимных структур.
Вы можете получить доступ к членам анонимной структуры, как если бы они были членами в содержащей структуре.
Однако это не совсем верно, поскольку анонимные структуры могут использоваться и в Visual C ++, как это и предлагается здесь .
Я был бы очень признателен за любую помощь.