#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))

本文解析了offsetof宏的工作原理,通过将0强制转换为指定类型的指针并指向0地址,利用成员的地址减去基地址0来计算成员在结构体中的偏移量。
#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))
1.(TYPE*)0   将0强转为TYPE类型的指针,且指向了0地址空间
2.(TYPE*)0->MEMEBER   指向结构体中的成员
3.&((TYPE*)0->MEMBER) 获取成员在结构体的位置,因为起始为0,所以获取的地址即为实际的偏移地址
 
分析:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了,size_t其实也就是int。

#ifndef __DS_C_MODULE_DEF_H__ #define __DS_C_MODULE_DEF_H__ /* for C model */ typedef struct _DS_OPT_ARRAY_EXT { U16 array_size; /* 数组中的最大数据个数,等同TABLE_DESC.size */ U16 active_size; /* 数组中的有效数据个数 */ U16 unit_type; /* 数组中的数据类型,同OPTION_DESC.type */ U16 unit_size; /* 数组中的数据类型的大小,同OPTION_DESC.size */ } DS_OPT_ARRAY_EXT; typedef struct _DS_OPT_DESC { char *name; U16 type; U16 flags; /* option级别控制的标记位 */ U32 offset; U32 size; /* 字符串类型的option,size不包含末尾的'\0'。 * 而二进制结构体中的成员定义大小为(size + 1),已包含末尾预留的'\0' */ union { struct { U32 enum_size; char *enum_array[0]; } enum_desc; DS_OPT_ARRAY_EXT array; } *extend; } DS_OPT_DESC; /* SEGMENT的描述 */ typedef struct _DS_SEG_DESC { char *name; U16 major_ver; U16 minor_ver; U16 rw; U16 flags; /* segment级别控制的标记位 */ U32 size; DS_OPT_DESC *option; U32 option_num; } DS_SEG_DESC; /* SECTION的描述 */ typedef struct _DS_SECT_DESC { char *name; U32 segment_num; DS_SEG_DESC *segment; } DS_SECT_DESC; /* table的描述 */ typedef struct _DS_TBL_DESC { char *name; /* table名,通过SLP接口指定type关键字,可以返回整个table下的所有section,不分是否表格型数据 */ U16 attribute; U16 flags; /* table级别控制的标记位 */ U32 size; /* 表格型数据使用,最大的section个数。非表格型数据置为0 */ U32 sect_seg_num; union { DS_SECT_DESC *section; DS_SEG_DESC *segment; } sect_seg; } DS_TBL_DESC; /* 数据块监控的描述 */ typedef struct _DS_DAT_MON_DESC { char *path; U32 attr; } DS_DAT_MON_DESC; /* module的描述 */ typedef struct _DS_MOD_DESC { char *name; S32 (*init)(); /* 初始化 */ S32 (*check)(BIN_AREA *bin_area); /* 数据合法性检查 */ S32 (*reload)(DS_MSG *msg); /* 重新加载配置数据 */ S32 (*start)(); /* 启动 */ S32 (*stop)(); /* 停止 */ U32 table_num; DS_TBL_DESC *table; U32 data_monitor_num; DS_DAT_MON_DESC *data_monitor; } DS_MOD_DESC; /* low-level(LL),低层级定义 */ /* * 仅简化初始化写法,所有参数与结构体一一对应。 * 使用低层级定义时,你【必须】完全了解每个参数的意义和作用是什么。否则,请使用高层级定义。 */ /* (LL)定义module描述 */ #define DSLL_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, module_tablen_num, module_table, module_data_monitor_num, module_data_monitor) \ { \ .name = module_name, \ .init = module_init, \ .check = module_check, \ .reload = module_reload, \ .start = module_start, \ .stop = module_stop, \ .table_num = module_tablen_num, \ .table = module_table, \ .data_monitor_num = module_data_monitor_num, \ .data_monitor = module_data_monitor \ } /* (LL)定义数据块监控描述 */ #define DSLL_DAT_MON(data_monitor_path, data_monitor_attr) \ { \ .path = data_monitor_path, \ .attr = data_monitor_attr \ } /* (LL)定义table描述 */ #define DSLL_TBL(table_name, table_attribute, table_flags, table_size, table_sect_seg, table_section, table_section_num) \ { \ .name = table_name, \ .attribute = table_attribute, \ .flags = table_flags, \ .size = table_size, \ .sect_seg_num = table_section_num, \ .sect_seg.table_sect_seg = table_section \ } /* (LL)定义section描述 */ #define DSLL_SECT(section_name, section_segment, section_segnum) \ { \ .name = section_name, \ .segment_num = section_segnum, \ .segment = section_segment \ } /* (LL)定义segment描述 */ #define DSLL_SEG(segment_name, segment_major_ver, segment_minor_ver, segment_rw, segment_flags, segment_size, segment_option, segment_optnum) \ { \ .name = segment_name, \ .major_ver = segment_major_ver, \ .minor_ver = segment_minor_ver, \ .rw = segment_rw, \ .flags = segment_flags, \ .size = segment_size, \ .option = segment_option, \ .option_num = segment_optnum \ } /* (LL)定义option描述 */ /* todo: option_size0时,表示由系统根据option_type确定,字符串和字节流不适用(需求待确定) */ #define DSLL_OPT(option_name, option_type, option_flags, option_offset, option_size, option_extend) \ { \ .name = option_name, \ .type = option_type, \ .flags = option_flags, \ .offset = option_offset, \ .size = option_size, \ .extend = (void *)(option_extend) \ } /* (LL)定义enum option扩展部分的描述 */ #define DSLL_OPT_ENUM_EXT(enum_desc_name, num, ...) \ struct \ { \ U32 enum_size; \ char *enum_array[num]; \ } enum_desc_name = \ { \ .enum_size = num, \ .enum_array = {__VA_ARGS__} \ } /* (LL)定义array option扩展部分的描述 */ #define DSLL_OPT_ARR_EXT(struct_name, arr_array_size, arr_unit_type, arr_unit_size) \ DS_OPT_ARRAY_EXT struct_name = \ { \ .array_size = arr_array_size, \ .active_size = 0, \ .unit_type = arr_unit_type, \ .unit_size = arr_unit_size, \ } /* high-level */ /* 二次封装的表格描述,根据需要将特定参数进行封装/自动填入,更加方便使用。对于要使用flag和回调接口的,需要用一次封装接口 */ /* 定义module描述 */ #define DS_STRUCT_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, module_table, module_data_monitor) \ DSLL_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, \ NULL == module_table ? 0 : NELEMENTS(module_table), module_table, \ NULL == module_data_monitor ? 0 : NELEMENTS(module_data_monitor), module_data_monitor) /* 定义数据块监控描述 */ #define DS_DAT_MON DSLL_DAT_MON /* 定义table描述 */ /* 普通数据 */ #define DS_TBL(table_name, table_attribute, section_desc, section_num) DSLL_TBL(table_name, table_attribute, 0, 0, section, section_desc, section_num) #define DS_STRUCT_TBL(table_name, table_attribute, section_desc) DSLL_TBL(table_name, table_attribute, 0, 0, section, section_desc, NELEMENTS(section_desc)) /* 表格型数据 */ #define DS_STRUCT_LSTTBL(table_name, table_attribute, table_size, segment_desc) \ DSLL_TBL(table_name, table_attribute, 0, table_size, segment, segment_desc, NELEMENTS(segment_desc)) /* 定义section描述 */ #define DS_STRUCT_SECT(section_name, segment_desc) DSLL_SECT(section_name, segment_desc, NULL == segment_desc ? 0 : NELEMENTS(segment_desc)) /* 定义segment描述 */ #define DS_STRUCT_SEG(segment_name, segment_rw, segment_flags, structure, option_desc) \ DSLL_SEG(segment_name, 1, 0, segment_rw, segment_flags, sizeof(structure), option_desc, NELEMENTS(option_desc)) /* 用户组权限,依次继承。依据用户组对应的MASK来确定值。 */ #define SEG_GROUP_GUEST 0x1 #define SEG_GROUP_ADMIN 0x2 #define SEG_GROUP_ROOT 0x4 #define SEG_GROUP_GOD 0x10 /* 系统内部使用的终极用户 */ #define SEG_GROUP_MASK (SEG_GROUP_GOD | SEG_GROUP_ROOT | SEG_GROUP_ADMIN | SEG_GROUP_GUEST) /* 提取用户组的掩码 */ #define SEG_NO_IMPEXP 0x80 /* segment级别禁止导入导出 */ /* 定义option描述 */ /* option basic 基础部分 */ /* 使用这组定义的限制: * 作为简化参数的代价,结构体的成员名必须要与SLP接口的option名相同 */ #define DS_STRUCT_OPT(option_name, option_type, option_flags, structure, member, option_size, extend_desc) \ DSLL_OPT(option_name, option_type, option_flags, offsetof(structure, member), option_size, extend_desc) #define DS_SWITCH_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_SWITCH, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_ENUM_OPT(structure, member, option_flags, enum_desc) DS_STRUCT_OPT(#member, OPT_TYPE_ENUM, option_flags, structure, member, MEMBER_SIZE(structure, member), enum_desc) #define DS_IP_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_IP, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_MAC_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_MAC, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_U8_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U8, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_S8_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S8, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_U16_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U16, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_S16_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S16, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_U32_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U32, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_S32_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S32, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_STR_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_STRING, option_flags, structure, member, MEMBER_SIZE(structure, member) - 1, NULL) #define DS_PSW_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_PASSWORD, option_flags, structure, member, MEMBER_SIZE(structure, member) - 1, NULL) #define DS_DBL_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_DOUBLE, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define DS_ARR_OPT(structure, member, option_flags, array_desc) DS_STRUCT_OPT(#member, OPT_TYPE_ARRAY, option_flags, structure, member, MEMBER_SIZE(structure, member), array_desc) #define DS_HEXSTRM_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_HEXSTREAM, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL) #define OPT_FLAG_NORM 0 /* 正常情况,没有特殊标记 */ #define OPT_FLAG_NO_IMPEXP 0x1 /* 禁止导入导出 */ #define IS_STR_OPT(option_type) ((OPT_TYPE_STRING == option_type) || (OPT_TYPE_PASSWORD == option_type)) /* option extend 扩展部分 */ /* 计算 __VA_ARGS__ 参数个数,最大支持64个参数 */ #define DS_ARG_COUNT(...) DS_INTERNAL_ARG_COUNT_PRIVATE(0, ##__VA_ARGS__, \ 64, 63, 62, 61, 60, \ 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \ 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \ 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) #define DS_INTERNAL_ARG_COUNT_PRIVATE( \ _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \ _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \ _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \ _60, _61, _62, _63, _64, N, ...) N /* 定义enum option扩展部分的描述 */ #define DS_ENUM_DESC(enum_desc_name, ...) DSLL_OPT_ENUM_EXT(enum_desc_name, DS_ARG_COUNT(__VA_ARGS__), __VA_ARGS__) /* NELEMENTS(((DS_STRUCT_DESC *)0)->option_member) = sizeof(DS_STRUCT_DESC.option_member)/sizeof((DS_STRUCT_DESC.option_member[0])) MEMBER_SIZE(DS_STRUCT_DESC, option_member[0]) = sizeof(DS_STRUCT_DESC.option_member[0]) */ /* 定义array option扩展部分的描述 */ #define DS_ARR_DESC(array_desc_name, array_unit_type, structure, member) \ DSLL_OPT_ARR_EXT(array_desc_name, NELEMENTS(((structure *)0)->member), array_unit_type, \ IS_STR_OPT(array_unit_type) ? MEMBER_SIZE(structure, member[0]) - 1 : MEMBER_SIZE(structure, member[0])) void ds_module_notify_ready(char *module_name); #define DS_MODULE_READY(module_name) ds_module_notify_ready((module_name)) #endif ——详解下这个data_model
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值