V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smdbh
V2EX  ›  C

函数能否实现透传不定长度参数,最终由 printf 打印

  •  
  •   smdbh · 116 天前 · 1778 次点击
    这是一个创建于 116 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如要封装一个打印函数,打印内容在最后,入口时 myprint1 ,后续时 myprint2 ,。。。,参数要如何写?

    void myprint1(uint8_t *pdata, size_t len, char *fmt, ...)
    {
    	myprint2(fmt,...);		// 这里参数怎么写
    }
    
    void mprint2(char *fmt, ...)
    {
    	printf(fmt,...);		// 如何调用
    }
    
    

    谢谢

    7 条回复    2024-08-27 19:29:16 +08:00
    smdbh
        1
    smdbh  
    OP
       116 天前
    va_list 感觉只能在最后解析,调用 vprintf 打印,如果多层感觉实现不了
    sadfasdfa
        2
    sadfasdfa  
       116 天前 via iPhone
    使用宏定义和__VA_ARGS__,90%小白问题都能用浏览器解决
    agagega
        3
    agagega  
       116 天前
    valord577
        5
    valord577  
       116 天前
    https://linux.die.net/man/3/vasprintf

    不确定 vasprintf 是不是你想要的函数

    ```c
    void mprint2(char* strp, ...) {

    }

    void mprint1(uint8_t *pdata, size_t len, char *fmt, ...) {
    char* strp = NULL;
    (void)vasprintf(&strp, fmt, ...);
    mprint2(strp);
    }
    ```
    laminux29
        6
    laminux29  
       116 天前
    1.如果函数的参数,或函数的返回值,过于复杂,我个人倾向于,直接把该函数的参数或返回值,定义为数据结构,也就是结构体或类。

    2.参数长度不确定,可以直接传参一个容器,比如 array 、list 、map 、set 等等。
    codehz
        7
    codehz  
       116 天前
    没有带 v 函数的的情况下,可以用 https://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html 来解决(
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1097 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.