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

C语言同名泛型函数重载实现:动态数组追加方案问询

实现动态数组双模式追加的可行方案

你的需求完全可以实现,核心思路是利用C语言预处理器的宏来模拟函数重载,无需修改底层ph_array_append_的函数名,就能让对外的ph_array_append支持两种调用形式。

具体实现步骤

  1. 定义参数分发宏
    通过预处理器的可变参数和参数个数匹配逻辑,自动根据传入参数的数量选择对应的处理函数:

    // 辅助宏:根据参数个数选择目标函数
    #define PH_ARRAY_APPEND_DISPATCH(_1, _2, _3, FUNC, ...) FUNC
    // 对外统一接口:自动匹配参数数量
    #define ph_array_append(...) PH_ARRAY_APPEND_DISPATCH(__VA_ARGS__, ph_array_append_data, ph_array_append_array)(__VA_ARGS__)
    
  2. 封装两种场景的处理函数
    分别实现数组追加、批量数据追加的封装逻辑,内部统一调用底层的ph_array_append_:

    // 场景1:追加另一个动态数组
    static inline void ph_array_append_array(ph_array_t *dest_arr, const ph_array_t *src_arr) {
        // 假设你的动态数组结构体包含data(元素指针)和count(元素数量)字段
        ph_array_append_(dest_arr, src_arr->data, src_arr->count);
    }
    
    // 场景2:追加指定数量的普通数据(结构体/指针等)
    static inline void ph_array_append_data(ph_array_t *dest_arr, const void *data, size_t elem_count) {
        ph_array_append_(dest_arr, data, elem_count);
    }
    

调用示例

// 追加另一个动态数组
ph_array_append(ph_arr1, ph_arr2);

// 追加4个自定义结构体/指针数据
ph_array_append(ph_arr1, my_struct_data, 4);

关键说明

  • 预处理器会在编译阶段判断参数个数:传入2个参数时,会匹配到ph_array_append_array;传入3个参数时,匹配到ph_array_append_data。
  • 若你的动态数组结构体字段名不同(比如不是data/count),只需调整ph_array_append_array里的字段引用即可。
  • 用static inline封装可以避免函数调用开销,同时保证代码的模块化。

内容的提问来源于stack exchange,提问作者MACAY CZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:17