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

如何编写可包装C可变参数函数的动态加载器

问题描述

为避免运行时对特定库产生硬依赖,我编写了一套动态加载器,通过dlopen/dlsym接口在运行时从目标库加载所需函数。构建阶段我使用包装函数,调用dlsym初始化得到的函数指针完成链接,但在处理可变参数函数时遇到问题:目前没有可行方法在动态加载这类函数后,正确转发其传入的可变参数。

我期望实现的可变参数支持包装库,需要满足以下约束:

  • 无需提前获知可变参数的数量,也不要求使用哨兵值标记参数末尾
  • 无需修改调用可变参数函数的上层代码(本场景中我不控制这部分代码的实现)

目前多数现有解答给出的变通方案,在我的使用场景下不具备实用性。

待包装目标函数

我需要包装的目标函数签名如下:

struct wl_proxy *wl_proxy_marshal_flags(
        struct wl_proxy *proxy,
        uint32_t opcode,
        const struct wl_interface *interface,
        uint32_t version,
        uint32_t flags,
        ...);

该函数由代码生成工具(参考wayland-scanner)输出的代码调用,但本问题并非专门针对Wayland场景。


注:此前已有大量同类问题被提出,例如C语言可变参数函数包装方法、C语言可变参数调用转发实现,但这些问题给出的类似vfprintf的替代方案并不适用于我的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:27:13