
请问,如果传入 main 函数的参数较多,应该如何组合处理啊
/* * demo.exe * 使用:demo.exe -name 12tall -age 12 -boy -newbie */ int main(argc,char* argv[]){ /* * 有一个思路: * 1. 参数分为两种:需要读取值的,例如 -name -age ;不需要读取值的,大胆称为 [状态参数] 吧,例如 -boy -newbie * 2. 一般需要传入值的参数都赋予默认值 * 3. [状态参数] 可以这样取值:-boy=01b、-girl=00b、-newbie=00b、-expert=10b ;这样就可以组成 00b~11b 四种状态 * 4. 然后对应着写 4 个状态处理的函数(参数就是需要取值的那些参数,例如 name、age ),放在一个存放函数指针数组里面,由状态参数组合成的最终值就是指向合适函数的索引 */ } 我的表述有问题,应该是:
鉴于if...else... 嵌套的层数太多不好理解
请问如何组合程序获取到的参数,以确定接下来的代码怎么走
写了一个例子,目标是做一个软盘读写的工具。感觉也没有精简太多,不包含解析参数的部分,只有最简单的状态处理
整体思路是利用宏命令批量声明组合函数,然后再手工实现函数定义,并绑定到一个数组中
然后程序就可以根据参数通过位掩码直接定位到函数
但是感觉宏定义那块还是很僵硬!
// 头文件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"); } 收获还是有的~
1 momocraft 2019-09-24 09:22:21 +08:00 学习使用 getopt |
2 12tall OP @momocraft 我重点表述错了,请问在已经拿到参数的情况下,怎么可以比较好地根据各项参数确定下一步状态,而不要写很多层 if...else... |
3 pkookp8 2019-09-24 09:46:29 +08:00 via Android 入参 设全局变量 主流程 if 某个全局变量 特殊流程 |
4 xpfd 2019-09-24 09:55:04 +08:00 写代码在保证功能的情况下 尽量写的简洁明了, 不用在意行数,反正计算机不费纸,考虑炫技的都是新手,写多了你就道,当年自己挖的坑都得自己埋,写得太隐晦了还没注释,以后自己看都会骂自己蠢 |
5 guyeu 2019-09-24 10:11:01 +08:00 你这个解决方案挺好的呀 |
7 richangfan 2019-09-24 10:20:47 +08:00 设置环境变量 |
9 12tall OP @richangfan 能否详细介绍下,谢谢! |
11 shylockhg 2019-09-24 10:30:14 +08:00 写个结构体,写进结构体里 |
13 richangfan 2019-09-24 10:47:11 +08:00 @12tall 《 UNIX 环境高级编程》这本操作系统入门书有写 |
15 imagecap 2019-09-24 10:58:17 +08:00 定义个参数的 class, 先用 getopt 把参数解析好,让后再根据执行的自己的逻辑代码。 class arguments { public: bool parse( int argc, char* argv[]) { // getop } public: std::string name; int age; bool sex; } int main( int argc, char* argv[] ) { arguments args; if( !args.parse( argc, argv ) ) return -1; if( args.age > 20 ) { ... } else { } return 0; } |
17 skydev 2019-09-24 11:54:07 +08:00 用 args.hxx 吧,像 python 的 argsparse 一样。Github 搜一下 |
20 xpfd 2019-09-24 18:11:33 +08:00 你后面的这种写法只适用于 进来的参数都比较统一 变化不大的情况 处理函数的参数也都单一的情况,如果进来的参数五花八门 处理函数返回值 还有参数要求也不一样的情况就难受了 |
21 superalsrk 2019-09-24 18:18:43 +08:00 同 17L, 几乎每个语言都有类似 argsparse 的东西, 几乎都算是一个标准了 |
22 tommyZZM 2019-09-24 18:51:53 +08:00 有解析的库的,引用一下就好了 类似这种 https://github.com/vietjtnguyen/argagg,C++ 的 |
23 12tall OP |