一般遍历结构体是为了读它的member,逐一做某种种操作。看下面一个结构体:
file:t.h
代码: 全选
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned char __u8;
typedef unsigned __u32;
typedef unsigned short __le16;
typedef struct{
int is_boy_girl;
__u32 how_old;
u8 hand_num;
u8 feet_num;
__u8 eyes_num;
__u8 head_num;
__u8 finger_count[12];
u16 heigh_cm;
__u16 weight_kg;
}BABY;
我在t.h里再加上几句代码:
代码: 全选
static int memberwidth_BABY[]={4,4,1,1,1,1,1,2,2};//记录每个成员的变量长度
static char* membername_BABY[]={"is_boy_girl","how_old","hand_num","feet_num","eyes_num","head_num","finger_count[12]","heigh_cm","weight_kg"};//记录每个成员的描述信息
static int memberlen_BABY[]={1,1,1,1,1,1,12,1,1};//记录每个成员数组长度(如果它不是数组,就=1)
但是,手工添加这三行代码的工作量很大...
这就是mw的基本功能,自动在源代码里添加这几行代码。
先看看mw实现的效果,打印一个结构体只要两句代码:
代码: 全选
#include<stdio.h>
#include"t.h"
#include"struinfo.h"
void main(void){
BABY baby={1,10,2,2,2,1,{0,1,2,3,4,5,6,7,8,9,10,11},100,30};
//printf member-infomation of baby
workon((char*)&baby,membername_BABY,memberwidth_BABY,memberlen_BABY,sizeof(memberwidth_BABY)/4);
struinfo();
}
编译链接,运行输出:
代码: 全选
@struinfo:
is_boy_girl: 1
how_old: 10
hand_num: 2
feet_num: 2
eyes_num: 2
head_num: 1
finger_count[12]: 0 1 2 3 4 5 6 7 8 9 10 11
heigh_cm: 100
weight_kg: 30
再说一说mw工具怎么用,分三步走:
1,在.h文件里,用typedef wstruct{...声明你想要遍历的结构体,例如上面的t.h要写成这样:
代码: 全选
//取这么多别名,是为了试验mw对结构体成员类型的识别
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned char __u8;
typedef unsigned __u32;
typedef unsigned short __le16;
typedef wstruct{//你没看错,这儿就是wstruct,是为了给mw识别
int is_boy_girl;
__u32 how_old;
u8 hand_num;
u8 feet_num;
__u8 eyes_num;
__u8 head_num;
__u8 finger_count[12];//多了两根
u16 heigh_cm;
__le16 weight_kg;
}BABY;
代码: 全选
//取这么多别名,是为了试验mw对结构体成员类型的识别
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned char __u8;
typedef unsigned __u32;
typedef unsigned short __le16;
typedef struct{//“w"标记已经被自动去掉
int is_boy_girl;
__u32 how_old;
u8 hand_num;
u8 feet_num;
__u8 eyes_num;
__u8 head_num;
__u8 finger_count[12];//多了两根
u16 heigh_cm;
__le16 weight_kg;
}BABY;//下面多出来几行代码
static int memberwidth_BABY[]={4,4,1,1,1,1,1,2,2};
static char* membername_BABY[]={"is_boy_girl","how_old","hand_num","feet_num","eyes_num","head_num","finger_count[12]","heigh_cm","weight_kg"};
static int memberlen_BABY[]={1,1,1,1,1,1,12,1,1};
------------------------------------------------------------------------------
ps:
1,如果有哪位高手知道更好的方法,尽管骂来,洗耳恭听。
2,本贴不欢迎讨论【结构体是否需要遍历,值得遍历】等问题。
3,源代码我都上传到这儿,写得很丑,轻易不要看,看不懂也别生气。http://download.csdn.net/detail/weiweishuo/5496587(收了1分,我下次再不收了...)
4,目前的mw功能很弱,只支持基元数据成员和数组成员,其它的结构体成员,union,指针成员还不被支持。(但可以被支持)
小工具的自动化程度还不高,需要手动输入头文件,而且一次只能处理一个wstruct标签,而且你声明wstruct类型的数据结构时,代码一定要特别规矩:例如wstruct和{之间不能有空格,两句代码不能同行....确切说,它现在还不实用。