Импорт структур как вложенных, анонимных структур в объединении с использованием 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 ответ

Вот что я нашел, может помочь вам:

  1. Необходимо изменить компилятор C/C++ на Compile как код C (/TC), чтобы получить поддержку анонимной структуры.

  1. В объявлении Evaluate() отсутствует объединение ключевых слов.

  2. Кажется, что анонимное объявление собственного типа данных в 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;
}*
Другие вопросы по тегам