如何将内置函数存入与reserved同索引的builtin数组及函数指针typedef解析
函数指针typedef解析与内置函数绑定实现
一、t_built的语法逻辑与作用
语法拆解
typedef int (*t_built)(t_cmds *, t_table *); 是对特定签名的函数指针类型的重定义,拆解来看:
(*t_built):表示t_built是一个指针,指向的是一个函数int:该函数的返回值类型为int(t_cmds *, t_table *):该函数接受两个指针参数,分别指向t_cmds和t_table类型的结构体
作用
- 简化代码:避免重复书写冗长的函数指针类型声明,用
t_built就能代替int (*)(t_cmds *, t_table *) - 提升可读性:看到
t_built就能明确这是指向符合特定参数、返回值规则的函数指针 - 保证类型一致性:强制所有绑定到
builtin数组的函数必须遵循同一签名,减少类型不匹配的编译错误
二、绑定自定义内置函数到结构体数组
1. 定义符合签名的内置函数
先实现每个内置命令对应的处理函数,必须严格匹配t_built的类型签名:
// echo命令处理函数 int builtin_echo(t_cmds *cmd, t_table *table) { // 自定义echo逻辑 return 0; } // pwd命令处理函数 int builtin_pwd(t_cmds *cmd, t_table *table) { // 自定义pwd逻辑 return 0; } // 依次实现其他内置命令的处理函数 int builtin_cd(t_cmds *cmd, t_table *table) { /* 逻辑 */ return 0; } int builtin_unset(t_cmds *cmd, t_table *table) { /* 逻辑 */ return 0; } int builtin_export(t_cmds *cmd, t_table *table) { /* 逻辑 */ return 0; } int builtin_exit(t_cmds *cmd, t_table *table) { /* 逻辑 */ return 0; } int builtin_env(t_cmds *cmd, t_table *table) { /* 逻辑 */ return 0; }
2. 初始化结构体,让索引一一对应
通过结构体初始化器,将命令字符串和对应的函数指针按相同索引绑定:
struct cmdline shell_cmds = { .reserved = {"echo", "pwd", "cd", "unset", "export", "exit", "env"}, .builtin = {builtin_echo, builtin_pwd, builtin_cd, builtin_unset, builtin_export, builtin_exit, builtin_env} };
3. 使用示例
当需要执行某个内置命令时,只需找到命令字符串在reserved中的索引,即可调用对应的函数:
// 假设已找到命令"echo"的索引为0 int result = shell_cmds.builtin[0](target_cmd, target_table);
内容的提问来源于stack exchange,提问作者Davit
相关产品推荐
相关产品推荐

