如何正确声明可传入get_operations的函数指针数组以调用指定函数?
解决函数指针数组声明与使用问题
首先明确:C标准中函数指针和对象指针(如void*)属于不同类型,不能直接互相转换,原代码用void**存储函数指针的做法不符合标准,存在未定义行为,这是你声明数组时出错的核心原因。
步骤1:统一函数指针类型(推荐方案)
假设你的8个函数签名一致(比如都是无参数、返回void),先定义函数指针类型(根据实际函数签名调整参数和返回值):
typedef void (*TirePMUOperation)(void);
步骤2:修改get_operations函数
将参数类型从void**改为定义好的函数指针数组类型:
void get_operations(TirePMUOperation operations[]) { operations[0] = tire_pressure_status; operations[1] = tire_temperature_status; operations[2] = tire_wear_level_status; operations[3] = tire_performance_score; operations[4] = pmu_compute_power; operations[5] = pmu_regenerate_energy; operations[6] = pmu_get_energy_usage; operations[7] = pmu_is_battery_healthy; }
步骤3:声明并使用函数指针数组
int main() { // 声明可容纳8个函数指针的数组 TirePMUOperation operations[8]; // 填充数组 get_operations(operations); // 调用数组中的函数 operations[0](); // 调用tire_pressure_status operations[1](); // 调用tire_temperature_status // ... 依次调用剩余函数 return 0; }
特殊情况:函数签名不一致
如果8个函数的参数或返回值不同,可通过结构体封装不同类型的函数指针:
// 定义结构体存储不同类型的函数指针 typedef struct { void (*tire_status_func)(void); int (*pmu_calc_func)(int); // 根据实际函数类型添加对应字段 } OperationSet; // 调整get_operations函数 void get_operations(OperationSet* ops) { ops->tire_status_func = tire_pressure_status; // ... 完成其他字段赋值 }
内容的提问来源于stack exchange,提问作者vasile ion
相关产品推荐
相关产品推荐

