win c 实现shell(命令解释器) 传参版(支持最大6个参数)

功能说明

win c 实现shell 传参版(支持最大6个参数):

  1. 可以将有参函数通过函数名注册到自己实现的shell,在shell终端通过输入函数名的方式,执行对应函数。
  2. 注册的函数在终端支持最大6个参数,每个参数可为整形或字符型
  3. shell支持上下键命令切换。
  4. tab回显上次命令。
  5. 左右键可以左右移动光标,实现对终端命令字符串的任意位置的编辑(添加,删除)。

前置基础

参考上个博客:“win c 实现shell(命令解释器) 无参版-CSDN博客”。在其代码的基础上作为本次的基础代码。也可以直接拷贝如下代码作为基础代码。

回顾上期干货:

main.h

#ifndef _MINI_SHELL_H_
#define _MINI_SHELL_H_

#define CMD_ADD_MAX_NUM 200   // 命令最大支持添加条数
#define CMD_NAME_MAX_SIZE 200 // 单个命令名字最大支持长度

// 函数指针类型
typedef void (*cmdFun)(void);

void registerCmd(const char* name, cmdFun func);

// 注册函数接口,在这个示例中,宏 REGISTER_CMD(cmd) 使用 #cmd 将命令名转换为字符串,
// 并将命令名和函数指针传递给 registerCmd 函数。这样,你只需传递一个参数即可注册命令。
#define REGISTER_CMD(cmd) registerCmd(#cmd, cmd)

typedef struct
{
    char cmdList[CMD_ADD_MAX_NUM][CMD_NAME_MAX_SIZE]; // "命令列表"(字符串)
    cmdFun cmdList_funPtr[CMD_ADD_MAX_NUM];           // "命令列表"对应的"函数指针列表"
    int cmdList_sum;                                  // "命令列表"中已经注册的命令个数
    int cmdList_curIndex;                             // 当前命令在"命令列表"的索引,初始为0

    char curInputCmd[CMD_NAME_MAX_SIZE]; // 当前输入的命令
    int curInputIndex;                   // 已经输入字符的索引,0是第一个字符的索引
    int curInputSum;                     // 已经输入字符的总数

    char oldInputCmd[CMD_NAME_MAX_SIZE]; // 上一条输入的命令
} shell_stu;

#endif

main.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "main.h"

#define KEY_FRONT 224 // 方向键的前导键
#define KEY_UP 72	  // 上键
#define KEY_DOWN 80	  // 下键
#define KEY_LEFT 75	  // 左键
#define KEY_RIGHT 77  // 右键
#define KEY_ENTER 13  // 回车键
#define KEY_BACK 8	  // 回退键
#define KEY_TAB 9	  // tab键

// 用于清空上次显示在终端上的打印,命令长度不同导致的,比如命令1:test_5555,命令2:test_2,
// 上下键由命令1切换到命令2,终端就会打印test_2555.这个就是用空格再次覆盖后面的555
#define SPACE_DISPLAY "                                                                "

static shell_stu shell;

static void shell_stu_init()
{
	shell.cmdList_sum = 0;
	shell.cmdList_curIndex = 0;
	memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
	shell.curInputIndex = 0;
	shell.curInputSum = 0;
	memset(shell.oldInputCmd, 0, sizeof(shell.oldInputCmd));
}

/**
 * @brief 在指定位置插入一个字符,并打印结果,不修改原字符串。
 * 该函数不会修改原字符串,而是构造一个新字符串并打印。
 * @param str 目标字符串。
 * @param ch 要插入的字符。
 * @param pos 插入字符的位置(从 0 开始索引)。
 */
void str_prtInsertChar(const char *str, char ch, int pos)
{
	int len = strlen(str);
	if (pos < 0 || pos > len)
	{
		printf("Invalid position.\n");
		return;
	}

	// printf("Result: ");
	for (int i = 0; i < len + 1; i++)
	{
		if (i == pos)
		{
			putchar(ch);
		}
		if (i < len)
		{
			putchar(str[i]);
		}
	}
	// printf("\n");
}

/**
 * @brief 在指定位置插入一个字符。
 * 该函数会将原有字符向右移动,以腾出空间插入新字符,并确保不会超出缓冲区大小。
 * @param str 目标字符串,插入字符后会修改该字符串。
 * @param ch 要插入的字符。
 * @param pos 插入字符的位置(从 0 开始索引)。
 * @param size 字符串的总缓冲区大小(用于防止溢出)。
 */
void str_insertChar(char *str, char ch, int pos, int size)
{
	int len = strlen(str);
	if (pos < 0 || pos > len || len + 1 >= size)
	{
		printf("Invalid position or insufficient buffer size.\n");
		return;
	}

	for (int i = len; i >= pos; i--)
	{
		str[i + 1] = str[i];
	}

	str[pos] = ch;
}


/**
 * @brief 在指定位置删除一个字符。
 * 该函数会将后续字符左移以填补被删除字符的位置。
 * @param str 目标字符串,删除字符后会修改该字符串。
 * @param pos 删除字符的位置(从 0 开始索引)。
 */
void str_deleteChar(char* str, int pos)
{
	int len = strlen(str);
	if (pos < 0 || pos >= len)
	{
		printf("Invalid position.\n");
		return;
	}

	for (int i = pos; i < len; i++)
	{
		str[i] = str[i + 1];
	}
}

// 回显命令
static void cmdShow()
{
	printf("\r%s\rCMD>>", SPACE_DISPLAY);
	str_prtInsertChar(shell.curInputCmd, '_', shell.curInputIndex);
}

// 清空输入的命令
static void curInputCmd_clear()
{
	memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
	shell.curInputIndex = 0;
	shell.curInputSum = 0;
}

//命令注册
void registerCmd(const char* name, cmdFun func)
{
	if (shell.cmdList_sum < CMD_ADD_MAX_NUM)
	{
		memset(shell.cmdList[shell.cmdList_sum], 0, CMD_NAME_MAX_SIZE);
		strcpy(shell.cmdList[shell.cmdList_sum], name);
		shell.cmdList_funPtr[shell.cmdList_sum] = func;
		shell.cmdList_sum++;
		printf("[CMD INSTALL OK][%02d] %s\n", shell.cmdList_sum, name);
	}
	else
	{
		printf("[CMD]table is full,regist failed!fun:%s\n", name);
	}
}

// 命令解析和执行
static void cmdRun(const char* cmd)
{
	int i;
	for (i = 0; i <= shell.cmdList_sum; i++)
	{
		if (strcmp(cmd, shell.cmdList[i]) == 0)
		{
			printf("\n");
			shell.cmdList_funPtr[i](); // 调用相应的函数
			return;
		}
	}
	printf("Unknown command: %s\n", cmd);
}

void logo_show()
{
	printf("=======================================================\n");
	printf("-        -        -        -        -        -        -\n");
	printf("       __  ____    ____   _   _  _____  _      _       \n");
	printf("      /  \\/   /  / ___/ / / / // ____// /    / /      \n");
	printf("     / /\\_// /  \\___ \\ / /_/ //  _/  / /    / /     \n");
	printf("    / /   / /   ___) //  _  // /___ / /___ / /___      \n");
	printf("   /_/   /_/  /____/ /_/ /_//_____//_____//_____/      \n");
	printf("-        -        -        -        -        -        -\n");
	printf("=======================================================\n");
	printf("MINI 交互终端                 [mini interface terminal]\n");
	printf("-------------------------------------------------------\n");
}

void t1()
{
	printf("this is t1 test\n");
}
void t2()
{
	printf("this is t2 test\n");
}
void t3()
{
	printf("this is t2 test\n");
}

void registerCmd_test_init()
{
	REGISTER_CMD(t1);
	REGISTER_CMD(t2);
	REGISTER_CMD(t3);
}

void help(void)
{
	printf("本SHELL已注册函数:\n");
	for (int i = 0; i < shell.cmdList_sum; i++)
	{
		printf("[CMD]  %s\n", shell.cmdList[i]);
	}
}

static void registerCmd_init()
{
	// ===========================================================
	//  临时测试
	// ===========================================================
#if 1 // ===start===临时测试===start===
	registerCmd_test_init();
#endif // ===end===临时测试===end===

// ===========================================================
//  功能测试函数:
//      src/source/main_loop
// ===========================================================
#if 1 // ===start===功能测试函数===start===

#endif // ===end===功能测试函数===end===

// ===========================================================
//  工具测试函数:
//      src/source/tools
//      src/test/tools
// ===========================================================
#if 1 // ===start===工具测试函数===start===

#endif // ===end===工具测试函数===end===

	// 打印注册命令
	REGISTER_CMD(help);
}

int main()
{
	logo_show();
	registerCmd_init();
	cmdShow();

	while (1)
	{
		// 检测按键
		int ch = _getch();
		// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值

		// 1>上下键会从命令列表中回显当cmd_list_crr_index的命令
		if (ch == KEY_FRONT)
		{
			// 特殊按键(如方向键)的前导字节
			ch = _getch();
			// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值

			if (ch == KEY_UP)
			{
				// 上键
				shell.cmdList_curIndex = (shell.cmdList_curIndex - 1 + shell.cmdList_sum) % shell.cmdList_sum;
				strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
				shell.curInputIndex = strlen(shell.curInputCmd) - 1;
				shell.curInputSum = strlen(shell.curInputCmd);
				printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
			}
			else if (ch == KEY_DOWN)
			{
				// 下键
				shell.cmdList_curIndex = (shell.cmdList_curIndex + 1) % shell.cmdList_sum;
				strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
				shell.curInputIndex = strlen(shell.curInputCmd) - 1;
				shell.curInputSum = strlen(shell.curInputCmd);
				printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
			}
			else if (ch == KEY_LEFT)
			{
				// 左键
				if (shell.curInputIndex > 0)
				{
					shell.curInputIndex--;

					cmdShow();
				}
			}
			else if (ch == KEY_RIGHT)
			{
				// 右键
				if (shell.curInputIndex < shell.curInputSum)
				{
					shell.curInputIndex++;

					cmdShow();
				}
			}
		}
		// 2>可以回车键可以执行输入的命令,或者回显CMD
		else if (ch == KEY_ENTER)
		{
			// 如果终端有输入字符,并且按了回测,就执行
			if (shell.curInputSum > 0)
			{
				// 备份上条命令
				strcpy(shell.oldInputCmd, shell.curInputCmd);

				cmdRun(shell.curInputCmd);

				curInputCmd_clear();
			}
			else
			{
				//这里表示没有任何普通字符输入,但是按了回车,可以起到换行的作用
				printf("\nCMD>>"); // 回显命令
			}
		}
		// 3>检查是否是回退键,回退键清除终端上的字符:
		else if (ch == KEY_BACK)
		{
			// 这里表示经过上下键回显完整的cmd字符
			if (shell.curInputIndex > 0)
			{
				str_deleteChar(shell.curInputCmd, shell.curInputIndex - 1);
				shell.curInputIndex--;
				shell.curInputSum--;

				cmdShow();
			}
		}
		// 4>检查是否是tab键,回显上次执行的命令
		else if (ch == KEY_TAB)
		{
			strcpy(shell.curInputCmd, shell.oldInputCmd);
			shell.curInputIndex = strlen(shell.curInputCmd);
			shell.curInputSum = strlen(shell.curInputCmd);

			cmdShow();
		}
		// 5>普通字符
		else
		{
			str_insertChar(shell.curInputCmd, ch, shell.curInputIndex, sizeof(shell.curInputCmd));

			shell.curInputSum++;
			shell.curInputIndex++;

			cmdShow();
		}
	}
	return 0;
}

传参功能实现逻辑

  1. 无参命令的回顾
    之前已实现无参函数的注册和调用:终端解析用户输入的命令字符串,与已注册命令进行匹配,若匹配成功,则调用对应的函数。

  2. 引入参数传递
    在此基础上,我们扩展支持命令传参。终端输入可包含命令及其参数,参数间使用空格分隔,示例如下:

    CMD>>cmd1 argv1 argv2 argv3
    

    其中,第一个单词是命令,后续为参数。

  3. 参数类型的区分

    由于终端输入的内容均为字符串,为区分字符串参数整型参数,我们约定:

    • 被引号 "" 包裹的参数解析为字符串char *)。
    • 未加引号的参数解析为整型int)。

    示例:

    CMD>>cmd1 "arg1" 123 arg3 "cmd4"
    

    解析结果:

    • "arg1" → 字符串 (char *)
    • 123 → 整型 (int)
    • arg3 → 由于无引号, 整型 (int)
    • "cmd4" → 字符串 (char *)
  4. 解析输入并调用函数

    获取用户输入后,首先解析出命令名,并在已注册的命令列表中查找匹配项。匹配成功后,获取参数并传递给相应的函数指针。例如,支持一个整型参数的函数指针定义如下:

    typedef void (*CmdFunc1_I)(int);
    

    这与无参函数指针 (typedef void (*CmdFunc)(void);) 类似,只是多了参数。

    调用时,可直接传参:

    cmdFuncPtr(atoi(argv1));
    
  5. 支持多个参数类型的组合

    由于参数可能是字符串整型,我们需要定义不同参数数量和类型组合的函数指针。例如:

    typedef void (*CmdFunc1_S)(char *);
    typedef void (*CmdFunc2_IS)(int, char *);
    typedef void (*CmdFunc2_SI)(char *, int);
    

    这样,若支持最多 6 个参数,我们需要定义所有可能的类型排列组合,共计 127 种函数指针(包括无参情况)。

  6. 函数指针匹配

    在解析命令时,需要根据参数个数及类型,匹配适当的函数指针,确保正确调用目标函数。虽然组合较多,但可通过枚举映射类型编码等技巧优化匹配逻辑(这一部分将在后续详细讨论)。

  7. 关于使用可变参数声明函数指针是否可行

    可变参数函数指针声明如下:

    #include <stdarg.h>//支持可变参数
    // 定义支持可变参数的函数指针类型
    typedef void (*CmdFunc)(int, ...);  // 使用 ... 表示可变参数
    

    由于声明的可变参数函数指针,其定义的第一个参数必须有,这里是int,可作为区分是有几个可变参数。由于可变参数第一个是int,就必须表示我们注册的函数,参数1必须是int,并且即便用不着也必须定义,不然参数类型匹配的时候,匹配不上。

    不使用可变参数函数指针的原因:

    1. 参数类型信息缺失:可变参数 (...) 不包含类型信息,无法直接区分 intchar *,需要额外的方式解析,增加复杂度。
    2. 参数匹配困难:注册的命令函数需要遵循统一的参数格式(如第一个参数必须是 int),否则匹配时可能失败,降低灵活性。
    3. 安全性问题:可变参数函数容易因参数解析错误导致未定义行为,如读取错误的类型或访问越界。
    4. 性能开销:相比固定参数,解析可变参数需要使用 va_list,存在额外的解析和类型转换开销。

    因此,我选择使用固定参数的函数指针,虽然需要定义多个函数指针类型,但能确保参数匹配的准确性和安全性。

详细步骤

127种函数指针的声明和匹配

新建cmd.h

#ifndef _CMD_H_
#define _CMD_H_

typedef int INT;
typedef char *CAR;

// 定义支持可变参数的函数指针类型
// 说明:cmdFun后面的第一个数字表示有几个参数,后面一次为该序号的参数的类型,I-数值;C-字符串
// 通用定义
typedef void (*cmdFun)(void);
// 无参数
typedef void (*cmdFun0)(void);
// ===strat===   1个参数   ===strat===
typedef void (*cmdFun1_I)(INT);
typedef void (*cmdFun1_C)(CAR);
// ===end===   1个参数   ===end===

// ===strat===   2个参数   ===strat===
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
// ===end===   2个参数   ===end===

// ===strat===   3个参数   ===strat===
typedef void (*cmdFun3_III)(INT, INT, INT);
typedef void (*cmdFun3_IIC)(INT, INT, CAR);
typedef void (*cmdFun3_ICI)(INT, CAR, INT);
typedef void (*cmdFun3_ICC)(INT, CAR, CAR);

typedef void (*cmdFun3_CII)(CAR, INT, INT);
typedef void (*cmdFun3_CIC)(CAR, INT, CAR);
typedef void (*cmdFun3_CCI)(CAR, CAR, INT);
typedef void (*cmdFun3_CCC)(CAR, CAR, CAR);
// ===end===   3个参数   ===end===

// ===strat===   4个参数   ===strat===
typedef void (*cmdFun4_IIII)(INT, INT, INT, INT);
typedef void (*cmdFun4_IIIC)(INT, INT, INT, CAR);
typedef void (*cmdFun4_IICI)(INT, INT, CAR, INT);
typedef void (*cmdFun4_IICC)(INT, INT, CAR, CAR);
typedef void (*cmdFun4_ICII)(INT, CAR, INT, INT);
typedef void (*cmdFun4_ICIC)(INT, CAR, INT, CAR);
typedef void (*cmdFun4_ICCI)(INT, CAR, CAR, INT);
typedef void (*cmdFun4_ICCC)(INT, CAR, CAR, CAR);

typedef void (*cmdFun4_CIII)(CAR, INT, INT, INT);
typedef void (*cmdFun4_CIIC)(CAR, INT, INT, CAR);
typedef void (*cmdFun4_CICI)(CAR, INT, CAR, INT);
typedef void (*cmdFun4_CICC)(CAR, INT, CAR, CAR);
typedef void (*cmdFun4_CCII)(CAR, CAR, INT, INT);
typedef void (*cmdFun4_CCIC)(CAR, CAR, INT, CAR);
typedef void (*cmdFun4_CCCI)(CAR, CAR, CAR, INT);
typedef void (*cmdFun4_CCCC)(CAR, CAR, CAR, CAR);
// ===end===   4个参数   ===end===

// ===strat===   5个参数   ===strat===
typedef void (*cmdFun5_IIIII)(INT, INT, INT, INT, INT);
typedef void (*cmdFun5_IIIIC)(INT, INT, INT, INT, CAR);
typedef void (*cmdFun5_IIICI)(INT, INT, INT, CAR, INT);
typedef void (*cmdFun5_IIICC)(INT, INT, INT, CAR, CAR);
typedef void (*cmdFun5_IICII)(INT, INT, CAR, INT, INT);
typedef void (*cmdFun5_IICIC)(INT, INT, CAR, INT, CAR);
typedef void (*cmdFun5_IICCI)(INT, INT, CAR, CAR, INT);
typedef void (*cmdFun5_IICCC)(INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_ICIII)(INT, CAR, INT, INT, INT);
typedef void (*cmdFun5_ICIIC)(INT, CAR, INT, INT, CAR);
typedef void (*cmdFun5_ICICI)(INT, CAR, INT, CAR, INT);
typedef void (*cmdFun5_ICICC)(INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_ICCII)(INT, CAR, CAR, INT, INT);
typedef void (*cmdFun5_ICCIC)(INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_ICCCI)(INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_ICCCC)(INT, CAR, CAR, CAR, CAR);

typedef void (*cmdFun5_CIIII)(CAR, INT, INT, INT, INT);
typedef void (*cmdFun5_CIIIC)(CAR, INT, INT, INT, CAR);
typedef void (*cmdFun5_CIICI)(CAR, INT, INT, CAR, INT);
typedef void (*cmdFun5_CIICC)(CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun5_CICII)(CAR, INT, CAR, INT, INT);
typedef void (*cmdFun5_CICIC)(CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun5_CICCI)(CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun5_CICCC)(CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_CCIII)(CAR, CAR, INT, INT, INT);
typedef void (*cmdFun5_CCIIC)(CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun5_CCICI)(CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun5_CCICC)(CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_CCCII)(CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun5_CCCIC)(CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_CCCCI)(CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_CCCCC)(CAR, CAR, CAR, CAR, CAR);
// ===end===   5个参数   ===end===

// ===strat===   6个参数   ===strat===
typedef void (*cmdFun6_IIIIII)(INT, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_IIIIIC)(INT, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_IIIICI)(INT, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_IIIICC)(INT, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_IIICII)(INT, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_IIICIC)(INT, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_IIICCI)(INT, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_IIICCC)(INT, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_IICIII)(INT, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_IICIIC)(INT, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_IICICI)(INT, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_IICICC)(INT, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_IICCII)(INT, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_IICCIC)(INT, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_IICCCI)(INT, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_IICCCC)(INT, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_ICIIII)(INT, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_ICIIIC)(INT, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_ICIICI)(INT, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_ICIICC)(INT, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_ICICII)(INT, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_ICICIC)(INT, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_ICICCI)(INT, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_ICICCC)(INT, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_ICCIII)(INT, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_ICCIIC)(INT, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_ICCICI)(INT, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_ICCICC)(INT, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_ICCCII)(INT, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_ICCCIC)(INT, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_ICCCCI)(INT, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_ICCCCC)(INT, CAR, CAR, CAR, CAR, CAR);

typedef void (*cmdFun6_CIIIII)(CAR, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_CIIIIC)(CAR, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_CIIICI)(CAR, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_CIIICC)(CAR, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CIICII)(CAR, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_CIICIC)(CAR, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CIICCI)(CAR, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CIICCC)(CAR, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CICIII)(CAR, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_CICIIC)(CAR, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CICICI)(CAR, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CICICC)(CAR, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CICCII)(CAR, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CICCIC)(CAR, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CICCCI)(CAR, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CICCCC)(CAR, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CCIIII)(CAR, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_CCIIIC)(CAR, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_CCIICI)(CAR, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_CCIICC)(CAR, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CCICII)(CAR, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_CCICIC)(CAR, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CCICCI)(CAR, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CCICCC)(CAR, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CCCIII)(CAR, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_CCCIIC)(CAR, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CCCICI)(CAR, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CCCICC)(CAR, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CCCCII)(CAR, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CCCCIC)(CAR, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CCCCCI)(CAR, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CCCCCC)(CAR, CAR, CAR, CAR, CAR, CAR);
// ===end===   6个参数   ===end===

void cmdRun_arg0(cmdFun cmd);
void cmdRun_arg1(cmdFun cmd, void *argv[]);
void cmdRun_arg2(cmdFun cmd, void *argv[]);
void cmdRun_arg3(cmdFun cmd, void *argv[]);
void cmdRun_arg4(cmdFun cmd, void *argv[]);
void cmdRun_arg5(cmdFun cmd, void *argv[]);
void cmdRun_arg6(cmdFun cmd, void *argv[]);

#endif

新建cmd.h技巧

由于需要实现127种的函数指针声明,如果我们一个一个敲,肯定是不现实的。这里提一点使用vscode编辑器可以通过按下鼠标中键实现多行编辑。或者可以考虑将其部分代码拷贝在另个文本,用全局替换方法。

1、基版本,1个参数
    // ===strat===   1个参数   ===strat===
    typedef void (*cmdFun1_I)(INT);
    typedef void (*cmdFun1_C)(CAR);
    // ===end===   1个参数   ===end===
22个参数在1个参数基础上
    2.1 拷贝1个参数的代码块,然后修改
        2.1.1 使用vscode的多行编辑,"cmdFun1_"全局修改为"cmdFun2_1"
        2.1.2 使用vscode的多行编辑,在括号第一个参数添加"INT,",效果如下
            typedef void (*cmdFun2_II)(INT, INT);
            typedef void (*cmdFun2_IC)(INT, CAR);
    2.2 再拷贝1个参数的代码块,然后修改
        2.1.1 使用vscode的多行编辑,"cmdFun1_"全局修改为"cmdFun2_2"
        2.1.2 使用vscode的多行编辑,在括号第一个参数添加"CAR,",效果如下
            typedef void (*cmdFun2_CI)(CAR, INT);
            typedef void (*cmdFun2_CC)(CAR, CAR);
    2.3 如此2个参数的代码块,就编写完成,如下:
        // ===strat===   2个参数   ===strat===
		typedef void (*cmdFun2_II)(INT, INT);
		typedef void (*cmdFun2_IC)(INT, CAR);
		typedef void (*cmdFun2_CI)(CAR, INT);
		typedef void (*cmdFun2_CC)(CAR, CAR);
        // ===end===   2个参数   ===end===
3、其它个数参数同理

新建cmd.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cmd.h"

/**
 * @brief  : 无参数的命令调用
 * @param  : cmd 函数指针
 */
void cmdRun_arg0(cmdFun cmd)
{
    cmdFun0 fun = (cmdFun0)cmd;
    fun();
}

/**
 * @brief  : 通过是否被字符"包裹的来判断字符串是否是数值
 * @param  : str
 * @return : 0-是数值,1-是字符串
 */
int str_if_string(const char* str)
{
    size_t len = strlen(str);
    if (len >= 2 && str[0] == '"' && str[len - 1] == '"')
    {
        return 1; // 是字符串
    }
    return 0; // 是数值
}

/**
 * @brief  : 1个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg1(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        cmdFun1_I fun = (cmdFun1_I)cmd;
        fun(atoi(argv[1]));
    }
    else
    {
        cmdFun1_C fun = (cmdFun1_C)cmd;
        fun(argv[1]);
    }
}

/**
 * @brief  : 2个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg2(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            cmdFun2_II fun = (cmdFun2_II)cmd;
            fun(atoi(argv[1]), atoi(argv[2]));
        }
        else
        {
            cmdFun2_IC fun = (cmdFun2_IC)cmd;
            fun(atoi(argv[1]), argv[2]);
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            cmdFun2_CI fun = (cmdFun2_CI)cmd;
            fun(argv[1], atoi(argv[2]));
        }
        else
        {
            cmdFun2_CC fun = (cmdFun2_CC)cmd;
            fun(argv[1], argv[2]);
        }
    }
}

/**
 * @brief  : 3个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg3(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_III fun = (cmdFun3_III)cmd;
                fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
            }
            else
            {
                cmdFun3_IIC fun = (cmdFun3_IIC)cmd;
                fun(atoi(argv[1]), atoi(argv[2]), argv[3]);
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_ICI fun = (cmdFun3_ICI)cmd;
                fun(atoi(argv[1]), argv[2], atoi(argv[3]));
            }
            else
            {
                cmdFun3_ICC fun = (cmdFun3_ICC)cmd;
                fun(atoi(argv[1]), argv[2], argv[3]);
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_CII fun = (cmdFun3_CII)cmd;
                fun(argv[1], atoi(argv[2]), atoi(argv[3]));
            }
            else
            {
                cmdFun3_CIC fun = (cmdFun3_CIC)cmd;
                fun(argv[1], atoi(argv[2]), argv[3]);
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_CCI fun = (cmdFun3_CCI)cmd;
                fun(argv[1], argv[2], atoi(argv[3]));
            }
            else
            {
                cmdFun3_CCC fun = (cmdFun3_CCC)cmd;
                fun(argv[1], argv[2], argv[3]);
            }
        }
    }
}

/**
 * @brief  : 4个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg4(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_IIII fun = (cmdFun4_IIII)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_IIIC fun = (cmdFun4_IIIC)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_IICI fun = (cmdFun4_IICI)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_IICC fun = (cmdFun4_IICC)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4]);
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_ICII fun = (cmdFun4_ICII)cmd;
                    fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_ICIC fun = (cmdFun4_ICIC)cmd;
                    fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_ICCI fun = (cmdFun4_ICCI)cmd;
                    fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_ICCC fun = (cmdFun4_ICCC)cmd;
                    fun(atoi(argv[1]), argv[2], argv[3], argv[4]);
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CIII fun = (cmdFun4_CIII)cmd;
                    fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CIIC fun = (cmdFun4_CIIC)cmd;
                    fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CICI fun = (cmdFun4_CICI)cmd;
                    fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CICC fun = (cmdFun4_CICC)cmd;
                    fun(argv[1], atoi(argv[2]), argv[3], argv[4]);
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CCII fun = (cmdFun4_CCII)cmd;
                    fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CCIC fun = (cmdFun4_CCIC)cmd;
                    fun(argv[1], argv[2], atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CCCI fun = (cmdFun4_CCCI)cmd;
                    fun(argv[1], argv[2], argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CCCC fun = (cmdFun4_CCCC)cmd;
                    fun(argv[1], argv[2], argv[3], argv[4]);
                }
            }
        }
    }
}

/**
 * @brief  : 5个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg5(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IIIII fun = (cmdFun5_IIIII)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IIIIC fun = (cmdFun5_IIIIC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IIICI fun = (cmdFun5_IIICI)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IIICC fun = (cmdFun5_IIICC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IICII fun = (cmdFun5_IICII)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IICIC fun = (cmdFun5_IICIC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IICCI fun = (cmdFun5_IICCI)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IICCC fun = (cmdFun5_IICCC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICIII fun = (cmdFun5_ICIII)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICIIC fun = (cmdFun5_ICIIC)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICICI fun = (cmdFun5_ICICI)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICICC fun = (cmdFun5_ICICC)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICCII fun = (cmdFun5_ICCII)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICCIC fun = (cmdFun5_ICCIC)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICCCI fun = (cmdFun5_ICCCI)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICCCC fun = (cmdFun5_ICCCC)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CIIII fun = (cmdFun5_CIIII)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CIIIC fun = (cmdFun5_CIIIC)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CIICI fun = (cmdFun5_CIICI)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CIICC fun = (cmdFun5_CIICC)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CICII fun = (cmdFun5_CICII)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CICIC fun = (cmdFun5_CICIC)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CICCI fun = (cmdFun5_CICCI)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CICCC fun = (cmdFun5_CICCC)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCIII fun = (cmdFun5_CCIII)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCIIC fun = (cmdFun5_CCIIC)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCICI fun = (cmdFun5_CCICI)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCICC fun = (cmdFun5_CCICC)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCCII fun = (cmdFun5_CCCII)cmd;
                        fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCCIC fun = (cmdFun5_CCCIC)cmd;
                        fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCCCI fun = (cmdFun5_CCCCI)cmd;
                        fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCCCC fun = (cmdFun5_CCCCC)cmd;
                        fun(argv[1], argv[2], argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
    }
}

/**
 * @brief  : 6个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg6(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIIIII fun = (cmdFun6_IIIIII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIIIIC fun = (cmdFun6_IIIIIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIIICI fun = (cmdFun6_IIIICI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIIICC fun = (cmdFun6_IIIICC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIICII fun = (cmdFun6_IIICII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIICIC fun = (cmdFun6_IIICIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIICCI fun = (cmdFun6_IIICCI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIICCC fun = (cmdFun6_IIICCC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICIII fun = (cmdFun6_IICIII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICIIC fun = (cmdFun6_IICIIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICICI fun = (cmdFun6_IICICI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICICC fun = (cmdFun6_IICICC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICCII fun = (cmdFun6_IICCII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICCIC fun = (cmdFun6_IICCIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICCCI fun = (cmdFun6_IICCCI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICCCC fun = (cmdFun6_IICCCC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICIIII fun = (cmdFun6_ICIIII)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICIIIC fun = (cmdFun6_ICIIIC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICIICI fun = (cmdFun6_ICIICI)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICIICC fun = (cmdFun6_ICIICC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICICII fun = (cmdFun6_ICICII)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICICIC fun = (cmdFun6_ICICIC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICICCI fun = (cmdFun6_ICICCI)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICICCC fun = (cmdFun6_ICICCC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCIII fun = (cmdFun6_ICCIII)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCIIC fun = (cmdFun6_ICCIIC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCICI fun = (cmdFun6_ICCICI)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCICC fun = (cmdFun6_ICCICC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCCII fun = (cmdFun6_ICCCII)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCCIC fun = (cmdFun6_ICCCIC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCCCI fun = (cmdFun6_ICCCCI)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCCCC fun = (cmdFun6_ICCCCC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIIIII fun = (cmdFun6_CIIIII)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIIIIC fun = (cmdFun6_CIIIIC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIIICI fun = (cmdFun6_CIIICI)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIIICC fun = (cmdFun6_CIIICC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIICII fun = (cmdFun6_CIICII)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIICIC fun = (cmdFun6_CIICIC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIICCI fun = (cmdFun6_CIICCI)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIICCC fun = (cmdFun6_CIICCC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICIII fun = (cmdFun6_CICIII)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICIIC fun = (cmdFun6_CICIIC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICICI fun = (cmdFun6_CICICI)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICICC fun = (cmdFun6_CICICC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICCII fun = (cmdFun6_CICCII)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICCIC fun = (cmdFun6_CICCIC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICCCI fun = (cmdFun6_CICCCI)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICCCC fun = (cmdFun6_CICCCC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCIIII fun = (cmdFun6_CCIIII)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCIIIC fun = (cmdFun6_CCIIIC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCIICI fun = (cmdFun6_CCIICI)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCIICC fun = (cmdFun6_CCIICC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCICII fun = (cmdFun6_CCICII)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCICIC fun = (cmdFun6_CCICIC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCICCI fun = (cmdFun6_CCICCI)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCICCC fun = (cmdFun6_CCICCC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCIII fun = (cmdFun6_CCCIII)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCIIC fun = (cmdFun6_CCCIIC)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCICI fun = (cmdFun6_CCCICI)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCICC fun = (cmdFun6_CCCICC)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCCII fun = (cmdFun6_CCCCII)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCCIC fun = (cmdFun6_CCCCIC)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCCCI fun = (cmdFun6_CCCCCI)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCCCC fun = (cmdFun6_CCCCCC)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
    }
}

新建cmd.c技巧

由于需要实现127种的函数指针匹配处理,如果我们一个一个敲,肯定是不现实的。这里提一点使用vscode编辑器可以通过按下鼠标中键实现多行编辑。或者可以考虑将其部分代码拷贝在另个文本,用全局替换方法。

1、基版本,1个参数
    void cmdRun_arg1(cmdFun cmd, void *argv[])
    {
        if (str_if_string(argv[1]) == 0)
        {
            cmdFun1_I fun = (cmdFun1_I)cmd;
            fun(atoi(argv[1]));
        }
        else
        {
            cmdFun1_C fun = (cmdFun1_C)cmd;
            fun(argv[1]);
        }
    }
22个参数在1个参数基础上
    2.1 拷贝1个参数的代码块的if代码块,然后修改
        2.1.1 新建代码块
            if (str_if_string(argv[1]) == 0)
            {
                【位置1}
            else
            {
                【位置2}
        2.1.2 制作位置【1】的代码块,
            2.1.2.1 拷贝基版的if代码块
            2.1.2.2 修改基版的if代码块中"cmdFun1_""cmdFun2_I"
            2.1.2.3 修改基版的if代码块中"argv[1]""argv[2]"
            2.1.2.4 修改基版的if代码块中"fun(""fun(atoi(argv[1]),",最终效果如下
                if (str_if_string(argv[2]) == 0)
                {
                    cmdFun2_II fun = (cmdFun2_II)cmd;
                    fun(atoi(argv[1]),atoi(argv[2]));
                }
                else
                {
                    cmdFun2_IC fun = (cmdFun2_IC)cmd;
                    fun(atoi(argv[1]),argv[2]);
                }
        2.1.2 制作位置【2】的代码块,
            2.1.2.1 拷贝基版的if代码块
            2.1.2.2 修改基版的if代码块中"cmdFun1_""cmdFun2_C"
            2.1.2.3 修改基版的if代码块中"argv[1]""argv[2]"
            2.1.2.4 修改基版的if代码块中"fun(""fun(argv[1],",最终效果如下
                if (str_if_string(argv[2]) == 0)
                {
                    cmdFun2_CI fun = (cmdFun2_CI)cmd;
                    fun(argv[1],atoi(argv[2]));
                }
                else
                {
                    cmdFun2_CC fun = (cmdFun2_CC)cmd;
                    fun(argv[1],argv[2]);
                }
        2.1.3 最终2个参数的代码效果如下:
            if (str_if_string(argv[1]) == 0)
            {
                if (str_if_string(argv[2]) == 0)
                {
                    cmdFun2_II fun = (cmdFun2_II)cmd;
                    fun(atoi(argv[1]),atoi(argv[2]));
                }
                else
                {
                    cmdFun2_IC fun = (cmdFun2_IC)cmd;
                    fun(atoi(argv[1]),argv[2]);
                }
            }
            else
            {
             	if (str_if_string(argv[2]) == 0)
                {
                    cmdFun2_CI fun = (cmdFun2_CI)cmd;
                    fun(argv[1],atoi(argv[2]));
                }
                else
                {
                    cmdFun2_CC fun = (cmdFun2_CC)cmd;
                    fun(argv[1],argv[2]);
                }
            }
3、其它个数参数同理

修改命令解析和执行cmdRun()

在main.c中修改

// 命令解析和执行
static void cmdRun(char *cmdLine)
{
	char *argv[10] = {0}; // 允许最多9个参数,argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
	int argc = 0;

	// 使用 strtok 解析字符串,拆分出命令名和参数
	char *token = strtok(cmdLine, " ");
	while (token != NULL && argc < 10)
	{
		argv[argc++] = token;
		token = strtok(NULL, " ");
	}

	// 在命令列表中查找匹配的命令
	if (argc > 0 && argv[0] != NULL)
	{
		// 只有在 argv[0] 非 NULL 时才调用 strcmp
		for (int i = 0; i < shell.cmdList_sum; i++)
		{
			if (strcmp(argv[0], shell.cmdList[i]) == 0)
			{
				printf("\n正在调用函数: %s\n", argv[0]);

				// 动态传递参数给命令函数
				// shell.cmdList_funPtr[i](argc, argv); // 传递参数,跳过 argv[0](命令名)
				switch (argc)
				{
				case 1:
				{
					// 无参数
					cmdRun_arg0(shell.cmdList_funPtr[i]);
					return;
				}
				case 2:
				{
					// 1个参数
					cmdRun_arg1(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 3:
				{
					// 2个参数
					cmdRun_arg2(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 4:
				{
					// 3个参数
					cmdRun_arg3(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 5:
				{
					// 4个参数
					cmdRun_arg4(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 6:
				{
					// 5个参数
					cmdRun_arg5(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 7:
				{
					// 6个参数
					cmdRun_arg6(shell.cmdList_funPtr[i], argv);
					return;
				}
				default:
				{
					printf("\r%s\rCMD>>%s", SPACE_DISPLAY, "参数过多,不支持参数大于6个的命令"); // 回显命令
					return;
				}
				}
			}
		}
		printf("\nSHELL 无此函数:%s\n", cmdLine);
	}
}

添加测试几个带参函数进行测试

新建test.h

#ifndef _MINI_SHELL_TEST_H_
#define _MINI_SHELL_TEST_H_

void registerCmd_test_init();

#endif

新建test.c

由于可能得参数类型过多,这里抽一个典型参数类型,进行测试

#include "mini_shell.h"

void t0()
{
    printf("t0:t0\n");
}
void t1_1(int i1)
{
    printf("t1:%d\n", i1);
}
void t1_2(char *i1)
{
    printf("t1:%s\n", i1);
}

void t2_11(int i1, int i2)
{
    printf("t2:%d,%d\n", i1, i2);
}
void t2_21(char *i1, int i2)
{
    printf("t2:%s,%d\n", i1, i2);
}
void t2_12(int i1, char *i2)
{
    printf("t2:%d,%s\n", i1, i2);
}
void t2_22(char *i1, char *i2)
{
    printf("t2:%s,%s\n", i1, i2);
}

void t3_1(int i1, int i2, int i3)
{
    printf("t3:%d,%d,%d\n", i1, i2, i3);
}
void t3_2(char *i1, char *i2, char *i3)
{
    printf("t3:%s,%s,%s\n", i1, i2, i3);
}

void t4_1(int i1, int i2, int i3, int i4)
{
    printf("t4:%d,%d,%d,%d\n", i1, i2, i3, i4);
}
void t4_2(char *i1, char *i2, char *i3, char *i4)
{
    printf("t4:%s,%s,%s,%s\n", i1, i2, i3, i4);
}

void t5_1(int i1, int i2, int i3, int i4, int i5)
{
    printf("t5:%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5);
}
void t5_2(char *i1, char *i2, char *i3, char *i4, char *i5)
{
    printf("t5:%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5);
}

void t6_1(int i1, int i2, int i3, int i4, int i5, int i6)
{
    printf("t6:%d,%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5, i6);
}
void t6_2(char *i1, char *i2, char *i3, char *i4, char *i5, char *i6)
{
    printf("t6:%s,%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5, i6);
}

void registerCmd_test_init()
{

    REGISTER_CMD(t0);

    REGISTER_CMD(t1_1);
    REGISTER_CMD(t1_2);

    REGISTER_CMD(t2_11);
    REGISTER_CMD(t2_12);
    REGISTER_CMD(t2_21);
    REGISTER_CMD(t2_22);

    REGISTER_CMD(t3_1);
    REGISTER_CMD(t3_2);

    REGISTER_CMD(t4_1);
    REGISTER_CMD(t4_2);

    REGISTER_CMD(t5_1);
    REGISTER_CMD(t5_2);

    REGISTER_CMD(t6_1);
    REGISTER_CMD(t6_2);
}

此时代码状态和运行效果,直接看干货

干货

源码

cmd.h

#ifndef _CMD_H_
#define _CMD_H_

typedef int INT;
typedef char* CAR;

// 定义支持可变参数的函数指针类型
// 说明:cmdFun后面的第一个数字表示有几个参数,后面一次为该序号的参数的类型,I-数值;C-字符串
// 通用定义
typedef void (*cmdFun)(void);
// 无参数
typedef void (*cmdFun0)(void);
// ===strat===   1个参数   ===strat===
typedef void (*cmdFun1_I)(INT);
typedef void (*cmdFun1_C)(CAR);
// ===end===   1个参数   ===end===

// ===strat===   2个参数   ===strat===
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
// ===end===   2个参数   ===end===

// ===strat===   3个参数   ===strat===
typedef void (*cmdFun3_III)(INT, INT, INT);
typedef void (*cmdFun3_IIC)(INT, INT, CAR);
typedef void (*cmdFun3_ICI)(INT, CAR, INT);
typedef void (*cmdFun3_ICC)(INT, CAR, CAR);

typedef void (*cmdFun3_CII)(CAR, INT, INT);
typedef void (*cmdFun3_CIC)(CAR, INT, CAR);
typedef void (*cmdFun3_CCI)(CAR, CAR, INT);
typedef void (*cmdFun3_CCC)(CAR, CAR, CAR);
// ===end===   3个参数   ===end===

// ===strat===   4个参数   ===strat===
typedef void (*cmdFun4_IIII)(INT, INT, INT, INT);
typedef void (*cmdFun4_IIIC)(INT, INT, INT, CAR);
typedef void (*cmdFun4_IICI)(INT, INT, CAR, INT);
typedef void (*cmdFun4_IICC)(INT, INT, CAR, CAR);
typedef void (*cmdFun4_ICII)(INT, CAR, INT, INT);
typedef void (*cmdFun4_ICIC)(INT, CAR, INT, CAR);
typedef void (*cmdFun4_ICCI)(INT, CAR, CAR, INT);
typedef void (*cmdFun4_ICCC)(INT, CAR, CAR, CAR);

typedef void (*cmdFun4_CIII)(CAR, INT, INT, INT);
typedef void (*cmdFun4_CIIC)(CAR, INT, INT, CAR);
typedef void (*cmdFun4_CICI)(CAR, INT, CAR, INT);
typedef void (*cmdFun4_CICC)(CAR, INT, CAR, CAR);
typedef void (*cmdFun4_CCII)(CAR, CAR, INT, INT);
typedef void (*cmdFun4_CCIC)(CAR, CAR, INT, CAR);
typedef void (*cmdFun4_CCCI)(CAR, CAR, CAR, INT);
typedef void (*cmdFun4_CCCC)(CAR, CAR, CAR, CAR);
// ===end===   4个参数   ===end===

// ===strat===   5个参数   ===strat===
typedef void (*cmdFun5_IIIII)(INT, INT, INT, INT, INT);
typedef void (*cmdFun5_IIIIC)(INT, INT, INT, INT, CAR);
typedef void (*cmdFun5_IIICI)(INT, INT, INT, CAR, INT);
typedef void (*cmdFun5_IIICC)(INT, INT, INT, CAR, CAR);
typedef void (*cmdFun5_IICII)(INT, INT, CAR, INT, INT);
typedef void (*cmdFun5_IICIC)(INT, INT, CAR, INT, CAR);
typedef void (*cmdFun5_IICCI)(INT, INT, CAR, CAR, INT);
typedef void (*cmdFun5_IICCC)(INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_ICIII)(INT, CAR, INT, INT, INT);
typedef void (*cmdFun5_ICIIC)(INT, CAR, INT, INT, CAR);
typedef void (*cmdFun5_ICICI)(INT, CAR, INT, CAR, INT);
typedef void (*cmdFun5_ICICC)(INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_ICCII)(INT, CAR, CAR, INT, INT);
typedef void (*cmdFun5_ICCIC)(INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_ICCCI)(INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_ICCCC)(INT, CAR, CAR, CAR, CAR);

typedef void (*cmdFun5_CIIII)(CAR, INT, INT, INT, INT);
typedef void (*cmdFun5_CIIIC)(CAR, INT, INT, INT, CAR);
typedef void (*cmdFun5_CIICI)(CAR, INT, INT, CAR, INT);
typedef void (*cmdFun5_CIICC)(CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun5_CICII)(CAR, INT, CAR, INT, INT);
typedef void (*cmdFun5_CICIC)(CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun5_CICCI)(CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun5_CICCC)(CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_CCIII)(CAR, CAR, INT, INT, INT);
typedef void (*cmdFun5_CCIIC)(CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun5_CCICI)(CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun5_CCICC)(CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_CCCII)(CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun5_CCCIC)(CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_CCCCI)(CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_CCCCC)(CAR, CAR, CAR, CAR, CAR);
// ===end===   5个参数   ===end===

// ===strat===   6个参数   ===strat===
typedef void (*cmdFun6_IIIIII)(INT, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_IIIIIC)(INT, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_IIIICI)(INT, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_IIIICC)(INT, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_IIICII)(INT, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_IIICIC)(INT, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_IIICCI)(INT, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_IIICCC)(INT, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_IICIII)(INT, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_IICIIC)(INT, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_IICICI)(INT, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_IICICC)(INT, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_IICCII)(INT, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_IICCIC)(INT, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_IICCCI)(INT, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_IICCCC)(INT, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_ICIIII)(INT, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_ICIIIC)(INT, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_ICIICI)(INT, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_ICIICC)(INT, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_ICICII)(INT, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_ICICIC)(INT, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_ICICCI)(INT, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_ICICCC)(INT, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_ICCIII)(INT, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_ICCIIC)(INT, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_ICCICI)(INT, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_ICCICC)(INT, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_ICCCII)(INT, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_ICCCIC)(INT, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_ICCCCI)(INT, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_ICCCCC)(INT, CAR, CAR, CAR, CAR, CAR);

typedef void (*cmdFun6_CIIIII)(CAR, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_CIIIIC)(CAR, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_CIIICI)(CAR, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_CIIICC)(CAR, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CIICII)(CAR, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_CIICIC)(CAR, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CIICCI)(CAR, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CIICCC)(CAR, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CICIII)(CAR, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_CICIIC)(CAR, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CICICI)(CAR, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CICICC)(CAR, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CICCII)(CAR, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CICCIC)(CAR, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CICCCI)(CAR, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CICCCC)(CAR, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CCIIII)(CAR, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_CCIIIC)(CAR, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_CCIICI)(CAR, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_CCIICC)(CAR, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CCICII)(CAR, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_CCICIC)(CAR, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CCICCI)(CAR, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CCICCC)(CAR, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CCCIII)(CAR, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_CCCIIC)(CAR, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CCCICI)(CAR, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CCCICC)(CAR, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CCCCII)(CAR, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CCCCIC)(CAR, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CCCCCI)(CAR, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CCCCCC)(CAR, CAR, CAR, CAR, CAR, CAR);
// ===end===   6个参数   ===end===

void cmdRun_arg0(cmdFun cmd);
void cmdRun_arg1(cmdFun cmd, void* argv[]);
void cmdRun_arg2(cmdFun cmd, void* argv[]);
void cmdRun_arg3(cmdFun cmd, void* argv[]);
void cmdRun_arg4(cmdFun cmd, void* argv[]);
void cmdRun_arg5(cmdFun cmd, void* argv[]);
void cmdRun_arg6(cmdFun cmd, void* argv[]);

#endif

cmd.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cmd.h"

/**
 * @brief  : 无参数的命令调用
 * @param  : cmd 函数指针
 */
void cmdRun_arg0(cmdFun cmd)
{
    cmdFun0 fun = (cmdFun0)cmd;
    fun();
}

/**
 * @brief  : 通过是否被字符"包裹的来判断字符串是否是数值
 * @param  : str
 * @return : 0-是数值,1-是字符串
 */
int str_if_string(const char* str)
{
    size_t len = strlen(str);
    if (len >= 2 && str[0] == '"' && str[len - 1] == '"')
    {
        return 1; // 是字符串
    }
    return 0; // 是数值
}

/**
 * @brief  : 1个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg1(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        cmdFun1_I fun = (cmdFun1_I)cmd;
        fun(atoi(argv[1]));
    }
    else
    {
        cmdFun1_C fun = (cmdFun1_C)cmd;
        fun(argv[1]);
    }
}

/**
 * @brief  : 2个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg2(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            cmdFun2_II fun = (cmdFun2_II)cmd;
            fun(atoi(argv[1]), atoi(argv[2]));
        }
        else
        {
            cmdFun2_IC fun = (cmdFun2_IC)cmd;
            fun(atoi(argv[1]), argv[2]);
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            cmdFun2_CI fun = (cmdFun2_CI)cmd;
            fun(argv[1], atoi(argv[2]));
        }
        else
        {
            cmdFun2_CC fun = (cmdFun2_CC)cmd;
            fun(argv[1], argv[2]);
        }
    }
}

/**
 * @brief  : 3个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg3(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_III fun = (cmdFun3_III)cmd;
                fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
            }
            else
            {
                cmdFun3_IIC fun = (cmdFun3_IIC)cmd;
                fun(atoi(argv[1]), atoi(argv[2]), argv[3]);
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_ICI fun = (cmdFun3_ICI)cmd;
                fun(atoi(argv[1]), argv[2], atoi(argv[3]));
            }
            else
            {
                cmdFun3_ICC fun = (cmdFun3_ICC)cmd;
                fun(atoi(argv[1]), argv[2], argv[3]);
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_CII fun = (cmdFun3_CII)cmd;
                fun(argv[1], atoi(argv[2]), atoi(argv[3]));
            }
            else
            {
                cmdFun3_CIC fun = (cmdFun3_CIC)cmd;
                fun(argv[1], atoi(argv[2]), argv[3]);
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                cmdFun3_CCI fun = (cmdFun3_CCI)cmd;
                fun(argv[1], argv[2], atoi(argv[3]));
            }
            else
            {
                cmdFun3_CCC fun = (cmdFun3_CCC)cmd;
                fun(argv[1], argv[2], argv[3]);
            }
        }
    }
}

/**
 * @brief  : 4个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg4(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_IIII fun = (cmdFun4_IIII)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_IIIC fun = (cmdFun4_IIIC)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_IICI fun = (cmdFun4_IICI)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_IICC fun = (cmdFun4_IICC)cmd;
                    fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4]);
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_ICII fun = (cmdFun4_ICII)cmd;
                    fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_ICIC fun = (cmdFun4_ICIC)cmd;
                    fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_ICCI fun = (cmdFun4_ICCI)cmd;
                    fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_ICCC fun = (cmdFun4_ICCC)cmd;
                    fun(atoi(argv[1]), argv[2], argv[3], argv[4]);
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CIII fun = (cmdFun4_CIII)cmd;
                    fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CIIC fun = (cmdFun4_CIIC)cmd;
                    fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CICI fun = (cmdFun4_CICI)cmd;
                    fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CICC fun = (cmdFun4_CICC)cmd;
                    fun(argv[1], atoi(argv[2]), argv[3], argv[4]);
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CCII fun = (cmdFun4_CCII)cmd;
                    fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CCIC fun = (cmdFun4_CCIC)cmd;
                    fun(argv[1], argv[2], atoi(argv[3]), argv[4]);
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    cmdFun4_CCCI fun = (cmdFun4_CCCI)cmd;
                    fun(argv[1], argv[2], argv[3], atoi(argv[4]));
                }
                else
                {
                    cmdFun4_CCCC fun = (cmdFun4_CCCC)cmd;
                    fun(argv[1], argv[2], argv[3], argv[4]);
                }
            }
        }
    }
}

/**
 * @brief  : 5个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg5(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IIIII fun = (cmdFun5_IIIII)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IIIIC fun = (cmdFun5_IIIIC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IIICI fun = (cmdFun5_IIICI)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IIICC fun = (cmdFun5_IIICC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IICII fun = (cmdFun5_IICII)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IICIC fun = (cmdFun5_IICIC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_IICCI fun = (cmdFun5_IICCI)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_IICCC fun = (cmdFun5_IICCC)cmd;
                        fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICIII fun = (cmdFun5_ICIII)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICIIC fun = (cmdFun5_ICIIC)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICICI fun = (cmdFun5_ICICI)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICICC fun = (cmdFun5_ICICC)cmd;
                        fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICCII fun = (cmdFun5_ICCII)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICCIC fun = (cmdFun5_ICCIC)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_ICCCI fun = (cmdFun5_ICCCI)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_ICCCC fun = (cmdFun5_ICCCC)cmd;
                        fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CIIII fun = (cmdFun5_CIIII)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CIIIC fun = (cmdFun5_CIIIC)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CIICI fun = (cmdFun5_CIICI)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CIICC fun = (cmdFun5_CIICC)cmd;
                        fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CICII fun = (cmdFun5_CICII)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CICIC fun = (cmdFun5_CICIC)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CICCI fun = (cmdFun5_CICCI)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CICCC fun = (cmdFun5_CICCC)cmd;
                        fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCIII fun = (cmdFun5_CCIII)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCIIC fun = (cmdFun5_CCIIC)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCICI fun = (cmdFun5_CCICI)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCICC fun = (cmdFun5_CCICC)cmd;
                        fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5]);
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCCII fun = (cmdFun5_CCCII)cmd;
                        fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCCIC fun = (cmdFun5_CCCIC)cmd;
                        fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5]);
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        cmdFun5_CCCCI fun = (cmdFun5_CCCCI)cmd;
                        fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]));
                    }
                    else
                    {
                        cmdFun5_CCCCC fun = (cmdFun5_CCCCC)cmd;
                        fun(argv[1], argv[2], argv[3], argv[4], argv[5]);
                    }
                }
            }
        }
    }
}

/**
 * @brief  : 6个参数的命令调用
 * @param  : cmd 函数指针
 * @param  : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
 */
void cmdRun_arg6(cmdFun cmd, void* argv[])
{
    if (str_if_string(argv[1]) == 0)
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIIIII fun = (cmdFun6_IIIIII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIIIIC fun = (cmdFun6_IIIIIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIIICI fun = (cmdFun6_IIIICI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIIICC fun = (cmdFun6_IIIICC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIICII fun = (cmdFun6_IIICII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIICIC fun = (cmdFun6_IIICIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IIICCI fun = (cmdFun6_IIICCI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IIICCC fun = (cmdFun6_IIICCC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICIII fun = (cmdFun6_IICIII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICIIC fun = (cmdFun6_IICIIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICICI fun = (cmdFun6_IICICI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICICC fun = (cmdFun6_IICICC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICCII fun = (cmdFun6_IICCII)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICCIC fun = (cmdFun6_IICCIC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_IICCCI fun = (cmdFun6_IICCCI)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_IICCCC fun = (cmdFun6_IICCCC)cmd;
                            fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICIIII fun = (cmdFun6_ICIIII)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICIIIC fun = (cmdFun6_ICIIIC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICIICI fun = (cmdFun6_ICIICI)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICIICC fun = (cmdFun6_ICIICC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICICII fun = (cmdFun6_ICICII)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICICIC fun = (cmdFun6_ICICIC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICICCI fun = (cmdFun6_ICICCI)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICICCC fun = (cmdFun6_ICICCC)cmd;
                            fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCIII fun = (cmdFun6_ICCIII)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCIIC fun = (cmdFun6_ICCIIC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCICI fun = (cmdFun6_ICCICI)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCICC fun = (cmdFun6_ICCICC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCCII fun = (cmdFun6_ICCCII)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCCIC fun = (cmdFun6_ICCCIC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_ICCCCI fun = (cmdFun6_ICCCCI)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_ICCCCC fun = (cmdFun6_ICCCCC)cmd;
                            fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
    }
    else
    {
        if (str_if_string(argv[2]) == 0)
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIIIII fun = (cmdFun6_CIIIII)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIIIIC fun = (cmdFun6_CIIIIC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIIICI fun = (cmdFun6_CIIICI)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIIICC fun = (cmdFun6_CIIICC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIICII fun = (cmdFun6_CIICII)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIICIC fun = (cmdFun6_CIICIC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CIICCI fun = (cmdFun6_CIICCI)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CIICCC fun = (cmdFun6_CIICCC)cmd;
                            fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICIII fun = (cmdFun6_CICIII)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICIIC fun = (cmdFun6_CICIIC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICICI fun = (cmdFun6_CICICI)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICICC fun = (cmdFun6_CICICC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICCII fun = (cmdFun6_CICCII)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICCIC fun = (cmdFun6_CICCIC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CICCCI fun = (cmdFun6_CICCCI)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CICCCC fun = (cmdFun6_CICCCC)cmd;
                            fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
        else
        {
            if (str_if_string(argv[3]) == 0)
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCIIII fun = (cmdFun6_CCIIII)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCIIIC fun = (cmdFun6_CCIIIC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCIICI fun = (cmdFun6_CCIICI)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCIICC fun = (cmdFun6_CCIICC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCICII fun = (cmdFun6_CCICII)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCICIC fun = (cmdFun6_CCICIC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCICCI fun = (cmdFun6_CCICCI)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCICCC fun = (cmdFun6_CCICCC)cmd;
                            fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
            else
            {
                if (str_if_string(argv[4]) == 0)
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCIII fun = (cmdFun6_CCCIII)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCIIC fun = (cmdFun6_CCCIIC)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCICI fun = (cmdFun6_CCCICI)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCICC fun = (cmdFun6_CCCICC)cmd;
                            fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
                        }
                    }
                }
                else
                {
                    if (str_if_string(argv[5]) == 0)
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCCII fun = (cmdFun6_CCCCII)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCCIC fun = (cmdFun6_CCCCIC)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
                        }
                    }
                    else
                    {
                        if (str_if_string(argv[6]) == 0)
                        {
                            cmdFun6_CCCCCI fun = (cmdFun6_CCCCCI)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
                        }
                        else
                        {
                            cmdFun6_CCCCCC fun = (cmdFun6_CCCCCC)cmd;
                            fun(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
                        }
                    }
                }
            }
        }
    }
}

test.h

#ifndef _MINI_SHELL_TEST_H_
#define _MINI_SHELL_TEST_H_

void registerCmd_test_init();

#endif

test.c

#include "main.h"

void t0()
{
    printf("t0:t0\n");
}
void t1_1(int i1)
{
    printf("t1:%d\n", i1);
}
void t1_2(char* i1)
{
    printf("t1:%s\n", i1);
}

void t2_11(int i1, int i2)
{
    printf("t2:%d,%d\n", i1, i2);
}
void t2_21(char* i1, int i2)
{
    printf("t2:%s,%d\n", i1, i2);
}
void t2_12(int i1, char* i2)
{
    printf("t2:%d,%s\n", i1, i2);
}
void t2_22(char* i1, char* i2)
{
    printf("t2:%s,%s\n", i1, i2);
}

void t3_1(int i1, int i2, int i3)
{
    printf("t3:%d,%d,%d\n", i1, i2, i3);
}
void t3_2(char* i1, char* i2, char* i3)
{
    printf("t3:%s,%s,%s\n", i1, i2, i3);
}

void t4_1(int i1, int i2, int i3, int i4)
{
    printf("t4:%d,%d,%d,%d\n", i1, i2, i3, i4);
}
void t4_2(char* i1, char* i2, char* i3, char* i4)
{
    printf("t4:%s,%s,%s,%s\n", i1, i2, i3, i4);
}

void t5_1(int i1, int i2, int i3, int i4, int i5)
{
    printf("t5:%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5);
}
void t5_2(char* i1, char* i2, char* i3, char* i4, char* i5)
{
    printf("t5:%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5);
}

void t6_1(int i1, int i2, int i3, int i4, int i5, int i6)
{
    printf("t6:%d,%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5, i6);
}
void t6_2(char* i1, char* i2, char* i3, char* i4, char* i5, char* i6)
{
    printf("t6:%s,%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5, i6);
}

void registerCmd_test_init()
{

    REGISTER_CMD(t0);

    REGISTER_CMD(t1_1);
    REGISTER_CMD(t1_2);

    REGISTER_CMD(t2_11);
    REGISTER_CMD(t2_12);
    REGISTER_CMD(t2_21);
    REGISTER_CMD(t2_22);

    REGISTER_CMD(t3_1);
    REGISTER_CMD(t3_2);

    REGISTER_CMD(t4_1);
    REGISTER_CMD(t4_2);

    REGISTER_CMD(t5_1);
    REGISTER_CMD(t5_2);

    REGISTER_CMD(t6_1);
    REGISTER_CMD(t6_2);
}

main.h

#ifndef _MINI_SHELL_H_
#define _MINI_SHELL_H_

#include "cmd.h"

#define CMD_ADD_MAX_NUM 200   // 命令最大支持添加条数
#define CMD_NAME_MAX_SIZE 200 // 单个命令名字最大支持长度

void registerCmd(const char* name, cmdFun func);

// 注册函数接口,在这个示例中,宏 REGISTER_CMD(cmd) 使用 #cmd 将命令名转换为字符串,
// 并将命令名和函数指针传递给 registerCmd 函数。这样,你只需传递一个参数即可注册命令。
#define REGISTER_CMD(cmd) registerCmd(#cmd, cmd)

typedef struct
{
    char cmdList[CMD_ADD_MAX_NUM][CMD_NAME_MAX_SIZE]; // "命令列表"(字符串)
    cmdFun cmdList_funPtr[CMD_ADD_MAX_NUM];           // "命令列表"对应的"函数指针列表"
    int cmdList_sum;                                  // "命令列表"中已经注册的命令个数
    int cmdList_curIndex;                             // 当前命令在"命令列表"的索引,初始为0

    char curInputCmd[CMD_NAME_MAX_SIZE]; // 当前输入的命令
    int curInputIndex;                   // 已经输入字符的索引,0是第一个字符的索引
    int curInputSum;                     // 已经输入字符的总数

    char oldInputCmd[CMD_NAME_MAX_SIZE]; // 上一条输入的命令
} shell_stu;

#endif

main.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "main.h"

#define KEY_FRONT 224 // 方向键的前导键
#define KEY_UP 72	  // 上键
#define KEY_DOWN 80	  // 下键
#define KEY_LEFT 75	  // 左键
#define KEY_RIGHT 77  // 右键
#define KEY_ENTER 13  // 回车键
#define KEY_BACK 8	  // 回退键
#define KEY_TAB 9	  // tab键

// 用于清空上次显示在终端上的打印,命令长度不同导致的,比如命令1:test_5555,命令2:test_2,
// 上下键由命令1切换到命令2,终端就会打印test_2555.这个就是用空格再次覆盖后面的555
#define SPACE_DISPLAY "                                                                "

static shell_stu shell;

static void shell_stu_init()
{
	shell.cmdList_sum = 0;
	shell.cmdList_curIndex = 0;
	memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
	shell.curInputIndex = 0;
	shell.curInputSum = 0;
	memset(shell.oldInputCmd, 0, sizeof(shell.oldInputCmd));
}

/**
 * @brief 在指定位置插入一个字符,并打印结果,不修改原字符串。
 * 该函数不会修改原字符串,而是构造一个新字符串并打印。
 * @param str 目标字符串。
 * @param ch 要插入的字符。
 * @param pos 插入字符的位置(从 0 开始索引)。
 */
void str_prtInsertChar(const char *str, char ch, int pos)
{
	int len = strlen(str);
	if (pos < 0 || pos > len)
	{
		printf("Invalid position.\n");
		return;
	}

	// printf("Result: ");
	for (int i = 0; i < len + 1; i++)
	{
		if (i == pos)
		{
			putchar(ch);
		}
		if (i < len)
		{
			putchar(str[i]);
		}
	}
	// printf("\n");
}

/**
 * @brief 在指定位置插入一个字符。
 * 该函数会将原有字符向右移动,以腾出空间插入新字符,并确保不会超出缓冲区大小。
 * @param str 目标字符串,插入字符后会修改该字符串。
 * @param ch 要插入的字符。
 * @param pos 插入字符的位置(从 0 开始索引)。
 * @param size 字符串的总缓冲区大小(用于防止溢出)。
 */
void str_insertChar(char *str, char ch, int pos, int size)
{
	int len = strlen(str);
	if (pos < 0 || pos > len || len + 1 >= size)
	{
		printf("Invalid position or insufficient buffer size.\n");
		return;
	}

	for (int i = len; i >= pos; i--)
	{
		str[i + 1] = str[i];
	}

	str[pos] = ch;
}


/**
 * @brief 在指定位置删除一个字符。
 * 该函数会将后续字符左移以填补被删除字符的位置。
 * @param str 目标字符串,删除字符后会修改该字符串。
 * @param pos 删除字符的位置(从 0 开始索引)。
 */
void str_deleteChar(char* str, int pos)
{
	int len = strlen(str);
	if (pos < 0 || pos >= len)
	{
		printf("Invalid position.\n");
		return;
	}

	for (int i = pos; i < len; i++)
	{
		str[i] = str[i + 1];
	}
}

// 回显命令
static void cmdShow()
{
	printf("\r%s\rCMD>>", SPACE_DISPLAY);
	str_prtInsertChar(shell.curInputCmd, '_', shell.curInputIndex);
}

// 清空输入的命令
static void curInputCmd_clear()
{
	memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
	shell.curInputIndex = 0;
	shell.curInputSum = 0;
}

//命令注册
void registerCmd(const char* name, cmdFun func)
{
	if (shell.cmdList_sum < CMD_ADD_MAX_NUM)
	{
		memset(shell.cmdList[shell.cmdList_sum], 0, CMD_NAME_MAX_SIZE);
		strcpy(shell.cmdList[shell.cmdList_sum], name);
		shell.cmdList_funPtr[shell.cmdList_sum] = func;
		shell.cmdList_sum++;
		printf("[CMD INSTALL OK][%02d] %s\n", shell.cmdList_sum, name);
	}
	else
	{
		printf("[CMD]table is full,regist failed!fun:%s\n", name);
	}
}

// 命令解析和执行
static void cmdRun(char *cmdLine)
{
	char *argv[10] = {0}; // 允许最多9个参数,argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
	int argc = 0;

	// 使用 strtok 解析字符串,拆分出命令名和参数
	char *token = strtok(cmdLine, " ");
	while (token != NULL && argc < 10)
	{
		argv[argc++] = token;
		token = strtok(NULL, " ");
	}

	// 在命令列表中查找匹配的命令
	if (argc > 0 && argv[0] != NULL)
	{
		// 只有在 argv[0] 非 NULL 时才调用 strcmp
		for (int i = 0; i < shell.cmdList_sum; i++)
		{
			if (strcmp(argv[0], shell.cmdList[i]) == 0)
			{
				printf("\n正在调用函数: %s\n", argv[0]);

				// 动态传递参数给命令函数
				// shell.cmdList_funPtr[i](argc, argv); // 传递参数,跳过 argv[0](命令名)
				switch (argc)
				{
				case 1:
				{
					// 无参数
					cmdRun_arg0(shell.cmdList_funPtr[i]);
					return;
				}
				case 2:
				{
					// 1个参数
					cmdRun_arg1(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 3:
				{
					// 2个参数
					cmdRun_arg2(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 4:
				{
					// 3个参数
					cmdRun_arg3(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 5:
				{
					// 4个参数
					cmdRun_arg4(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 6:
				{
					// 5个参数
					cmdRun_arg5(shell.cmdList_funPtr[i], argv);
					return;
				}
				case 7:
				{
					// 6个参数
					cmdRun_arg6(shell.cmdList_funPtr[i], argv);
					return;
				}
				default:
				{
					printf("\r%s\rCMD>>%s", SPACE_DISPLAY, "参数过多,不支持参数大于6个的命令"); // 回显命令
					return;
				}
				}
			}
		}
		printf("\nSHELL 无此函数:%s\n", cmdLine);
	}
}

void logo_show()
{
	printf("=======================================================\n");
	printf("-        -        -        -        -        -        -\n");
	printf("       __  ____    ____   _   _  _____  _      _       \n");
	printf("      /  \\/   /  / ___/ / / / // ____// /    / /      \n");
	printf("     / /\\_// /  \\___ \\ / /_/ //  _/  / /    / /     \n");
	printf("    / /   / /   ___) //  _  // /___ / /___ / /___      \n");
	printf("   /_/   /_/  /____/ /_/ /_//_____//_____//_____/      \n");
	printf("-        -        -        -        -        -        -\n");
	printf("=======================================================\n");
	printf("MINI 交互终端                 [mini interface terminal]\n");
	printf("-------------------------------------------------------\n");
}

void help(void)
{
	printf("本SHELL已注册函数:\n");
	for (int i = 0; i < shell.cmdList_sum; i++)
	{
		printf("[CMD]  %s\n", shell.cmdList[i]);
	}
}

static void registerCmd_init()
{
	// ===========================================================
	//  临时测试
	// ===========================================================
#if 1 // ===start===临时测试===start===
	registerCmd_test_init();
#endif // ===end===临时测试===end===

// ===========================================================
//  功能测试函数:
//      src/source/main_loop
// ===========================================================
#if 1 // ===start===功能测试函数===start===

#endif // ===end===功能测试函数===end===

// ===========================================================
//  工具测试函数:
//      src/source/tools
//      src/test/tools
// ===========================================================
#if 1 // ===start===工具测试函数===start===

#endif // ===end===工具测试函数===end===

	// 打印注册命令
	REGISTER_CMD(help);
}

int main()
{
	logo_show();
	shell_stu_init();
	registerCmd_init();
	cmdShow();

	while (1)
	{
		// 检测按键
		int ch = _getch();
		// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值

		// 1>上下键会从命令列表中回显当cmd_list_crr_index的命令
		if (ch == KEY_FRONT)
		{
			// 特殊按键(如方向键)的前导字节
			ch = _getch();
			// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值

			if (ch == KEY_UP)
			{
				// 上键
				shell.cmdList_curIndex = (shell.cmdList_curIndex - 1 + shell.cmdList_sum) % shell.cmdList_sum;
				strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
				shell.curInputIndex = strlen(shell.curInputCmd) - 1;
				shell.curInputSum = strlen(shell.curInputCmd);
				printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
			}
			else if (ch == KEY_DOWN)
			{
				// 下键
				shell.cmdList_curIndex = (shell.cmdList_curIndex + 1) % shell.cmdList_sum;
				strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
				shell.curInputIndex = strlen(shell.curInputCmd) - 1;
				shell.curInputSum = strlen(shell.curInputCmd);
				printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
			}
			else if (ch == KEY_LEFT)
			{
				// 左键
				if (shell.curInputIndex > 0)
				{
					shell.curInputIndex--;

					cmdShow();
				}
			}
			else if (ch == KEY_RIGHT)
			{
				// 右键
				if (shell.curInputIndex < shell.curInputSum)
				{
					shell.curInputIndex++;

					cmdShow();
				}
			}
		}
		// 2>可以回车键可以执行输入的命令,或者回显CMD
		else if (ch == KEY_ENTER)
		{
			// 如果终端有输入字符,并且按了回测,就执行
			if (shell.curInputSum > 0)
			{
				// 备份上条命令
				strcpy(shell.oldInputCmd, shell.curInputCmd);

				cmdRun(shell.curInputCmd);

				curInputCmd_clear();
			}
			else
			{
				//这里表示没有任何普通字符输入,但是按了回车,可以起到换行的作用
				printf("\nCMD>>"); // 回显命令
			}
		}
		// 3>检查是否是回退键,回退键清除终端上的字符:
		else if (ch == KEY_BACK)
		{
			// 这里表示经过上下键回显完整的cmd字符
			if (shell.curInputIndex > 0)
			{
				str_deleteChar(shell.curInputCmd, shell.curInputIndex - 1);
				shell.curInputIndex--;
				shell.curInputSum--;

				cmdShow();
			}
		}
		// 4>检查是否是tab键,回显上次执行的命令
		else if (ch == KEY_TAB)
		{
			strcpy(shell.curInputCmd, shell.oldInputCmd);
			shell.curInputIndex = strlen(shell.curInputCmd);
			shell.curInputSum = strlen(shell.curInputCmd);

			cmdShow();
		}
		// 5>普通字符
		else
		{
			str_insertChar(shell.curInputCmd, ch, shell.curInputIndex, sizeof(shell.curInputCmd));

			shell.curInputSum++;
			shell.curInputIndex++;

			cmdShow();
		}
	}
	return 0;
}

运行效果

在这里插入图片描述

在这里插入图片描述

完结撒花

备注:Linux c 实现shell 传参版(支持最大6个参数),功能和这个实现方式基本一致,只是有些地方需要额外进行处理,后期有时间更新

【<<<宇宙安全声明>>>】

安全声明(Security Disclaimer)

本博客提供的所有代码示例仅用于学习和参考目的,作者不对其适用性、安全性或可靠性作任何保证。在使用本博客提供的代码时,请注意以下事项:

  1. 风险自负
    本博客的代码可能未经严格测试,仅供技术交流和学习使用。任何人使用这些代码造成的直接或间接损失,作者概不负责。
  2. 环境适配
    代码可能需要根据具体环境进行适配和修改,请确保在安全的测试环境中运行,避免影响生产系统。
  3. 安全性
    本博客的代码可能未进行完整的安全审查,可能存在漏洞或安全风险。在生产环境使用前,请务必进行充分的安全测试和代码审计。
  4. 第三方依赖
    本代码纯c实现,使用C语言基本库即可。
  5. 版权与责任
    本博客代码完全免费,如有引用请标注来源。
  6. 法律合规
    任何代码的使用均应遵守当地法律法规,禁止用于非法用途,否则后果自负。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值