gpt4 book ai didi

c - 如何向 va_list 添加参数

转载 作者:太空狗 更新时间:2023-10-29 15:26:13 24 4
gpt4 key购买 nike

我有以下代码:

int __dmasprintf (char **s, const char *format, ...) {

char buf[512];
va_list arg;
int ret;
va_start(arg,format);
ret = vsprintf(buf, format, arg);
va_end(arg);

*s = strdup(buf);
if (*s == NULL) return -1;
return 0;
}

我想在调用 vsprintf() 之前向 va_list arg 添加一个参数,因为我的 format 包含最后有 1 个额外参数。

如何向 va_list arg 添加参数(例如 char * myarg)?

或者是否可以向 vsprintf() 传递自定义列表?

最佳答案

你不能。

您要么需要进行两次 vsprintf(肯定是 vsnprintf?)调用,要么用可变参数宏替换您的函数,例如

#define __dmasprintf(S, FMT, ...) ( \
(*S = do_dmasprintf(FMT, __VA_ARGS__, my_arg)) == NULL ? -1 : 0)

char *do__dmasprintf (const char *format, ...) {

char buf[512];
va_list arg;
int ret;
va_start(arg,format);
ret = vsnprintf(buf, sizeof(buf), format, arg);
va_end(arg);

char *s = strdup(buf);
return s;
}

注意事项:

  1. 我用 vsnprintf 替换了 vsprintf。没有理由在这里(或几乎任何其他地方)使用前者
  2. 你忽略了ret。你应该吗?
  3. 我保留了与原始参数类似的宏参数布局,但由于 __VA_ARGS__ 必须是一个或多个参数(不能为空),这意味着至少需要一个参数后FMT。如果你想在它后面允许零参数,只需完全删除 FMT 参数。

关于c - 如何向 va_list 添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31725850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com