Импорт структур как вложенных, анонимных структур в объединении с использованием C ++ - PullRequest
0 голосов
/ 05 декабря 2018

Обратите внимание на следующие «неизменяемые» объявления:

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 Ответ

0 голосов
/ 05 декабря 2018

Вот что я могу вам помочь:

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

enter image description here

Отсутствует ключевое слово union в объявлении 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;
}*
...