Импорт структур как вложенных, анонимных структур в объединении с использованием C++
Пожалуйста, рассмотрите следующие "неизменяемые" объявления:
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++, как это предлагается здесь.
Я был бы очень признателен за любую помощь.
1 ответ
Вот что я нашел, может помочь вам:
- Необходимо изменить компилятор C/C++ на Compile как код C (/TC), чтобы получить поддержку анонимной структуры.
В объявлении Evaluate() отсутствует объединение ключевых слов.
Кажется, что анонимное объявление собственного типа данных в SensorDataOverlay могло бы запутать компилятор, поэтому я пытаюсь собрать их в единую структуру как CommonHeader и поместить один пакет в SensorDataOverlay.
Я обнаружил, что T_MESSAGE и SensorDataOverlay используют одну и ту же схему в первых трех полях, я бы сказал, что было бы лучше заменить их на CommonHeader, что будет иметь больше смысла с точки зрения наследования данных. Так как в начале вопроса вы указали, что T_MESSAGE неизменен, поэтому я не делаю никаких изменений в следующем коде.
полный код, размещенный здесь, может работать, и я предполагаю, что схема смещения памяти соответствует вашим потребностям.
*struct CommonHeader
{
unsigned int skipUiTimestamp;
unsigned char skipUcDataType;
unsigned int skipUiDataSize;
};
struct SensorDataOverlay
{
/* Use CommonHeader instead */
//unsigned : 32; // Skip uiTimestamp
//unsigned : 8; // Skip ucDataType
//unsigned : 32; // Skip uiDataSize
struct CommonHeader;
struct T_SENSORDATA_HEADER;
};
union SensorDataMessage
{
TT_MESSAGE;
struct SensorDataOverlay;
};
int Evaluate(union SensorDataMessage msg)
{
unsigned char tmp = msg.uiDataSize;
unsigned char tmp2 = msg.ucSensorType;
return 0;
}*