如何在C语言中用同一函数实现返回值与传引用并合并函数
合并速率获取函数的可行方案
你的两个函数核心逻辑完全一致,都是对runningrate做truncf转换后强转为uint16_t,只是返回结果的方式不同——一个通过指针输出,一个直接返回值。可以通过以下两种方式合并,同时覆盖两种使用场景:
方案一:保留单一返回值函数,适配两种场景
只保留直接返回值的函数,在需要填充CAN缓冲区时,直接将返回值赋值给指针指向的变量即可:
static float runningrate; uint16_t GetRate(void) { return (uint16_t)truncf(runningrate); }
场景用法:
- 打印到控制台:直接使用返回值
printf("Current rate: %u\n", GetRate()); - 填充CAN缓冲区:将返回值赋值给目标指针
void fill_can_buffer(uint16_t* rate) { if (rate != NULL) { *rate = GetRate(); } }
这种方式最简洁,完全消除了代码冗余,且两种场景的调用逻辑清晰直观。
方案二:实现同时支持两种输出方式的函数
如果希望用一个函数同时支持“直接返回”和“指针输出”两种模式,可以设计带可选指针参数的函数:
static float runningrate; uint16_t GetRate(uint16_t* out_rate) { uint16_t calculated_rate = (uint16_t)truncf(runningrate); // 如果传入有效指针,就把计算结果写入指针指向的地址 if (out_rate != NULL) { *out_rate = calculated_rate; } // 同时返回计算结果 return calculated_rate; }
场景用法:
- 打印到控制台:传入
NULL忽略指针输出,直接用返回值printf("Current rate: %u\n", GetRate(NULL)); - 填充CAN缓冲区:传入目标缓冲区的指针
uint16_t can_buffer_val; GetRate(&can_buffer_val); // 此时can_buffer_val已被填充好,可用于CAN发送
这种方案保留了两种输出方式的灵活性,同时只维护一份计算逻辑,后续修改逻辑时只需改动一处。
内容的提问来源于stack exchange,提问作者ro88
相关产品推荐
相关产品推荐

