V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
miaomico
V2EX  ›  问与答

求助呀, C 语言大佬可以帮看看,函数传参问题

  •  
  •   miaomico · 2020-05-25 18:25:35 +08:00 · 980 次点击
    这是一个创建于 1643 天前的主题,其中的信息可能已经有所发展或是发生改变。

    img1 链接: https://s1.ax1x.com/2020/05/25/tCPlK1.png

    img2 链接: https://s1.ax1x.com/2020/05/25/tCPMvR.png

    为啥 print 的结构体参数,第三个参数 s 的 num 不是 1 呀?

    4 条回复    2020-05-26 08:41:10 +08:00
    thedrwu
        1
    thedrwu  
       2020-05-25 18:43:13 +08:00 via Android
    ...,*(strict print_s *)arg_list[2]);

    一般都传个结构的 const 指针(或者引用,如果 c++)。不会把整个结构塞进去。那样不仅能减少复制,对不同的 abi 也友好。
    miaomico
        2
    miaomico  
    OP
       2020-05-25 19:10:38 +08:00
    @thedrwu 哇,真的好了,谢谢啦,

    那我如果直接 *arg_list[2] ,是按 void* 类型来的,所以只有 sizeof(int) 的长度有效?

    ”一般都传个结构的 const 指针“,这个的话,我的理解的话,我想用 void *(*shell)(void* func, ...) 来实现,不定函数原型,func 用来传具体函数指针,后面可变参数,用来传前面 func 所需的参数,不管啥类型函数原型都能用,所以并不知道是参数啥类型,参数个数是多少,所以用 void*, 还有可变参数

    如果理解的地方或方式不对,请指教。
    thedrwu
        3
    thedrwu  
       2020-05-26 02:35:08 +08:00
    每次压栈 /压寄存器的宽度视 ABI 而定,不一定是 sizeof(int)。
    va_arg 很容易写成不安全的代码,写起来也很繁琐。不是很推荐。
    miaomico
        4
    miaomico  
    OP
       2020-05-26 08:41:10 +08:00
    @thedrwu
    我原来的想法太天真了,我想这个样子搞的,哈哈,

    char* format = "%d";
    int num = 1;
    void *arg_list[8] = {
    &format,
    &num,
    }

    void *shell(void* func, void *arg_list[8]){
    void *(*local_func)(void*,...) = func;

    return local_func(arg_list[0],,,,arg_list[7]);
    }

    shell(printf, arg_list);

    +问题:
    主要是遇到了,每次初始化函数不一样的情况,这个地方就叫 ‘调用点‘ 吧,然后我就想着能不能整个万能函数接口,知道具体函数和参数就可以正常使用;

    -想法:
    现在来看的话好像不行了,没法指定参数类型,压栈好像就压不对;
    我这会儿只能想到给每个初始化函数都写个单独的壳子,传入 arg_list[8],在壳子里面指定参数类型,然后调用点调用函数指针,指向某个壳子?

    大佬有啥高见嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:58 · PVG 03:58 · LAX 11:58 · JFK 14:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.