0

请考虑以下“不可更改”声明:

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++ 中使用,就像这里所建议的那样

我将非常感谢任何帮助。

4

1 回答 1

0

以下是我发现的内容可能会对您有所帮助:

  1. 必须将 C/C++ 编译器更改为Compile as C code (/TC)以获得匿名结构支持。

在此处输入图像描述

  1. Evaluate()的声明中缺少关键字union

  2. SensorDataOverlay中的匿名本机数据类型声明似乎会使编译器感到困惑,因此我尝试将它们收集到一个单一结构中作为CommonHeader,并将一个包放入SensorDataOverlay

我发现T_MESSAGESensorDataOverlay在前三个字段中共享相同的方案,我会说替换为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;
}*
于 2018-12-05T08:27:15.983 回答