C语言同名泛型函数重载实现:动态数组追加方案问询
实现动态数组双模式追加的可行方案
你的需求完全可以实现,核心思路是利用C语言预处理器的宏来模拟函数重载,无需修改底层ph_array_append_的函数名,就能让对外的ph_array_append支持两种调用形式。
具体实现步骤
定义参数分发宏
通过预处理器的可变参数和参数个数匹配逻辑,自动根据传入参数的数量选择对应的处理函数:// 辅助宏:根据参数个数选择目标函数 #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__)封装两种场景的处理函数
分别实现数组追加、批量数据追加的封装逻辑,内部统一调用底层的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
相关产品推荐
相关产品推荐

