求助呀, C 语言大佬可以帮看看,函数传参问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
miaomico
V2EX    问与答

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

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

    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     Solana     5348 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 07:56 PVG 15:56 LAX 23:56 JFK 02:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86