- 论坛徽章:
- 8
|
原帖由 chinaren_fy 于 2008-7-22 19:21 发表 ![]()
有一个结构体,定义如下:
typedef struct tagStatus
{
int nStatus;
void (*a_proc)(void);
void (*b_proc)(void);
} STATUS;
根据nStatus的不同,有不同的a_proc和b_proc处理,目 ...
C语言场合,可以:
- enum status_handle { status1 = 0, status2, ...};
- //不好意思,typedef语法忘了,这里不一定对,明白意思就是
- typedef Proc_a_type void p(void);
- //假设有500个状态
- #define Max_Status_Num 500
- //声明一个proc_a的数组
- #define Declare_Proc_a_Entries Proc_a_Type Proc_a_Entry[Max_Status_Num]={0}
- //设置特定的status_handle对应哪个proc_a
- #define Reg_Proc_a_For_Handle(status_handle1, Proc_a) Proc_a_Entry[status_handle1]=Proc_a
- //这个函数也可以定义成宏
- //这样在编译期即可确定status的场合,可以得到编译器的优化支持,获得更佳性能
- void Call_Proc_a_For_Handle(status_handle handle)
- {
- //检查参数合法性
- assert(handle < Max_Status_Num && handle >= 0);
- //检查对应proc_a是否存在
- if (Proc_a_Entry[handle]==NULL)
- {
- //to do: print error msg or throw
- return;
- }
- Proc_a_Entry[handle]();
- }
复制代码
proc_b和proc_c类似处理即可。
在实现文件里可以这样使用:
- Declare_Proc_a_Entries;
- Declare_Proc_b_Entries;
- Declare_Proc_c_Entries;
- //声明status1的proc_a处理函数
- void proc_a_status1(void)
- {
- //do sth
- }
- //注册之
- Regist_Proc_a_For_Handle(status1, proc_a_status1);
- //如果status2也可用它处理,可这样注册之
- Regist_Proc_a_For_Handle(status2, proc_a_status1);
- //已知status,调用对应的proc_a
- cur_status_handle = status1;
- Call_Proc_a_For_Handle(cur_status_handle);
复制代码
以上仅供参考,不保证能通过编译。
在c++、泛型支持下,应该还有更简洁优雅的解决方案;现在没时间,等以后再写吧。 |
|