写了一个例子,目标是做一个软盘读写的工具。感觉也没有精简太多,不包含解析参数的部分,只有最简单的状态处理
整体思路是利用宏命令批量声明组合函数,然后再手工实现函数定义,并绑定到一个数组中
然后程序就可以根据参数通过位掩码直接定位到函数
但是感觉宏定义那块还是很僵硬!
// 头文件bin2img.h
#ifndef __BIN2IMG__
#define __BIN2IMG__
#define Params const char* fIn,const char* fOut,int offset
typedef void (*pStateFunction)(Params);
// format
#define F_RAW 0b00000000
#define F_FAT12 0b00000001
// boot
#define B_NORMAL 0b00000000
#define B_BOOT 0b00010000
// init
#define I_NONE 0b00000000
#define I_INIT 0b01000000
// 批量声明函数,共2*2*2=8个
#define GenStateFunctions(_)\
void _(Params);
// 磁盘格式
#define FORMAT_LIST(_,$)\
_(F_RAW_##$)\
_(F_FAT12_##$)
// 是否是启动盘
#define BOOT_LIST(_,$)\
FORMAT_LIST(_,B_NORMAL_##$)\
FORMAT_LIST(_,B_BOOT_##$)
// 初始化还是直接读写
#define INIT_LIST(_)\
BOOT_LIST(_,I_NONE)\
BOOT_LIST(_,I_INIT)
INIT_LIST(GenStateFunctions);
#undef INIT_LIST
#undef BOOT_LIST
#undef FORMAT_LIST
#undef GenStateFunctions
// 给函数指针数组赋值
#define SetStateFunction(index,func)\
funs[index]=func;
// 默认帮助函数
void ShowHelp(void);
#elif
#endif
// c 文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "bin2img.h"
pStateFunction funs[256] = { NULL };
// argc 一般至少为1,因为程序名也会算做参数
int main(int argc, char* argv[])
{
// 添加状态函数,这里感觉韩式不够简洁
SetStateFunction(I_INIT, F_RAW_B_NORMAL_I_INIT);
// 测试函数
funs[I_INIT](NULL,NULL,0);
return 0;
}
// 函数的实现
void F_RAW_B_NORMAL_I_INIT(const char* fIn, const char* fOut, int offset)
{
printf("raw normal init");
}
void ShowHelp(void)
{
printf("write binary file to image file or floppy\n");
}
收获还是有的~