0

在我的项目中,我使用结构与 char 数组的联合将字节插入到不同的结构类型中。

有一个数组保存特定结构的结构,以了解接下来会出现哪种变量。

对于每一种结构,一个具有该结构类型的全局变量用于找出填充字节的位置。因此它的所有成员都直接用0xFF初始化...... 当插入字节的函数处理一个字段时,它总是在数组中搜索下一个不为 0 的字节。并在该位置插入字节。

结构类型本身可以由用户从宏中创建。有时数组的大小可能不同,并且还包含结构。在正常的基本类型中,数组的第一个值也被初始化为 0xFF,并且插入函数知道它的最大长度,因此确定下一个值从哪里开始是没有问题的。但是有struct数组的时候,第一个初始值可以很清楚的识别出来,但是第二个就有问题了,那我就不知道从哪里开始了。

由于结构是嵌套的,它也可能在开头有填充字节。因此,我需要初始化前两个值,以找出数组内第一个结构的最后一个成员和第二个结构的第一个成员之间的距离。

在基本类型上,如下所示:

整数数组[2]={2,2}

但是如果数组是由用户定义的,它也可以是:

整数数组[0]={2,2} 或整数数组[1]={2,2}

GCC 会为此创建一个警告并仅填充数组的可用部分。

现在我有以下问题:

1) 编译器行为:当我执行上述操作时,其他编译器会做什么?仅显示警告并跳过不适合的值是否是通用标准?是否有编译器(也考虑 C++ 编译器)会引发错误并且不编译或做任何奇怪的事情?

2)你知道找出填充字节的其他可能性吗?

示例它在代码中的外观:

rosc_buildup_t rosc_static_msg_buildup_array_a_test_pkg__gnampf[]=
{
ROS_MSG_BUILDUP_TYPE_ARRAY,
    ROS_MSG_BUILDUP_TYPE_STRING,

ROS_MSG_BUILDUP_TYPE_MESSAGE_END,
}

#define ROSC_USERDEF_STATIC_MSG_a_test_pkg__gnampf(\
USER_TYPE,\
MAX_SIZE_STRING_fest)\
typedef \
struct  /*Main Message Start*/\
{\
struct  /*fest*/\
{\
    uint32_t size;\
    struct  /*fest array data*/\
    {\
        uint32_t size;\
        bool oversize;\
        char str_data[MAX_SIZE_STRING_fest];\
    }data[4];\
}fest;\
}\
uint32_t rosc_static_msg_length_definition__a_test_pkg__gnampf__ ## USER_TYPE[]={\
4,\
MAX_SIZE_STRING_fest};\
union\
{\
const rosc_static_msg__a_test_pkg__gnampf__ ## USER_TYPE msg;\
const char padding_out[ sizeof( rosc_static_msg__a_test_pkg__gnampf__ ##     USER_TYPE     )];\
}rosc_static_msg_lookup__a_test_pkg__gnampf__ ## USER_TYPE ={{ 0xFFFFFFFF, {{     0xFFFFFFFF,0xFF, {0xFF} }} }};

更新(1)

3)如果另一个结构内有一个结构,如下所示:

struct
{
   uint8_t foo;
   ... whatever...
   struct
   {
     uint8_t foo1;
     uint16_t foo2;
     uint8_t foo3;
   }b[3];
 }a;

foo1,总是在开头还是在 foo1 开始之前可以有填充字节?

4

2 回答 2

1

1) 编译器行为:当我执行上述操作时,其他编译器会做什么?仅显示警告并跳过不适合的值是否是通用标准?是否有编译器(也考虑 C++ 编译器)会引发错误并且不编译或做任何奇怪的事情?

int array[1]={2,2}

这是一个无效的声明。编译器至少需要提出诊断并被授权停止编译。零元素数组的声明也是如此。

于 2013-06-27T22:14:05.523 回答
0

我现在找到了一种更好的方法来跳过结构中的填充字节并通过使用 stddef.h 中的 offsetof 宏找到变量的位置,如果它不可用,也可以自己定义。

    /* Offset of member MEMBER in a struct of type TYPE. */
    #define offsetof(TYPE, MEMBER)\
    ( (size_t) &( ( (TYPE *) 0 )->MEMBER ) )
于 2013-07-09T13:03:44.847 回答