请考虑以下“不可更改”声明:
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++ 中使用,就像这里所建议的那样。
我将非常感谢任何帮助。