如何用单个C函数实现不同数据类型静态数组的最后元素修改
通用数组末尾元素更新函数实现(支持多类型)
你可以利用C11标准引入的**泛型选择器_Generic**来实现一个支持多类型的单一入口,避免为每种类型重复编写逻辑。下面提供两种可行方案:
方案1:泛型宏+类型专属函数(复用现有实现)
如果想保留你已有的各类型函数实现,用泛型宏做统一入口:
#include <stdint.h> // 统一入口宏 #define fifo_datas_update(data_in, datas, size) \ _Generic((datas), \ int16_t*: fifo_datas_update_int16, \ uint16_t*: fifo_datas_update_uint16, \ float*: fifo_datas_update_float \ )(data_in, datas, size) // 复用你已有的(或补充)类型专属函数 void fifo_datas_update_int16(int16_t data_in, int16_t *datas, uint8_t size) { datas[size-1] = data_in; } void fifo_datas_update_uint16(uint16_t data_in, uint16_t *datas, uint8_t size) { datas[size-1] = data_in; } void fifo_datas_update_float(float data_in, float *datas, uint8_t size) { datas[size-1] = data_in; }
使用示例
const uint8_t dtsize = 3; // int16_t类型测试 static int16_t datas_int16[dtsize] = {10, 20, 30}; int16_t new_int16 = 40; fifo_datas_update(new_int16, datas_int16, dtsize); // uint16_t类型测试 static uint16_t datas_uint16[dtsize] = {100, 200, 300}; uint16_t new_uint16 = 400; fifo_datas_update(new_uint16, datas_uint16, dtsize); // float类型测试(和你原代码逻辑一致) static float datas_fake[dtsize] = {10.0f, 20.0f, 30.0f}; float new_value = 40.0f; fifo_datas_update(new_value, datas_fake, dtsize);
方案2:极简泛型宏(无需单独写函数)
因为你的核心逻辑只是赋值数组最后一个元素,逻辑极简单,可以直接把逻辑嵌入宏中,省去类型专属函数:
#include <stdint.h> #define fifo_datas_update(data_in, datas, size) \ do { \ _Generic((datas), \ int16_t*: (datas)[size-1] = (int16_t)(data_in), \ uint16_t*: (datas)[size-1] = (uint16_t)(data_in), \ float*: (datas)[size-1] = (float)(data_in) \ ); \ } while(0)
注意事项
- 该方案依赖C11及以上标准,主流编译器(GCC、Clang、MSVC2015+)均支持
- 若需新增支持类型,只需在
_Generic的分支列表中添加对应类型的赋值逻辑 - 用
do-while(0)包裹是为了保证宏在if/for等语句中使用时不会出现语法错误
内容的提问来源于stack exchange,提问作者booo
相关产品推荐
相关产品推荐

