You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:43:10