C 中可变参数如何直接传递到 printf()

42 天前
 XIVN1987

用到一个库,,它有一个接口函数如下:

/**
 * @brief     interface print format data
 * @param[in] fmt is the format data
 * @note      none
 */
void ov2640_interface_debug_print(const char *const fmt, ...)
{
}

这个函数的函数原型与 printf 完全一致,,所以我想像下面这样直接把它的参数传递给 printf ,,可是编译器报错,,请问应该怎么改??

void ov2640_interface_debug_print(const char *const fmt, ...)
{
	printf(fmt, ...);
}
1452 次点击
所在节点    C
11 条回复
654656413245
42 天前
printf(fmt, __VA_ARGS__);
geelaw
42 天前
关键词:vprintf
XIVN1987
42 天前
@geelaw
下面这样确实可以,,不过感觉还是不够简洁、直接。。
``` C
void ov2640_interface_debug_print(const char *const fmt, ...)
{
va_list args;

va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
```
llxvs
42 天前
@XIVN1987 C 不是一門簡潔、直接的語言
julyclyde
42 天前
@XIVN1987 这就是标准做法
geelaw
42 天前
@XIVN1987 #3 好像可变参数本身就不是简洁直接的东西。

另外这也提示你应该把实现放在 void v_ov2460_interface_debug_print(char const *fmt, va_list arg); 里面,并在可变参数版本里调用它。

请注意,如果这个函数本身需要在 vprintf 之外操作可变参数列表,需要 va_copy 之,否则行为不确定。
pursuer
42 天前
我觉得 C 中缺少两个机制,一个是动态函数调用,类似 libffi 。另一个是简单的栈切换,类似 ucontext 。这两个东西依赖 C 的 ABI ,又有不少上层应用需要这个特性,特别是 ffi 。不知道会不会有一天被加入标准库。
cwxiaos
42 天前
用宏套一下也可以吧
XIVN1987
42 天前
感谢大家回复,,

那看来 vprintf 就是最简单的了,,感谢 @geelaw 指点。。
codehz
42 天前
其实要用编译器扩展的话可以简单点,直接
void ov2640_interface_debug_print(const char *const fmt, ...)
{
printf(fmt, __builtin_va_arg_pack());
}
(仅限于 gcc ,嵌入式的话可以不考虑别的编译器
不过还是不建议这么写
codehz
42 天前
哦忘了,那玩意得加__attribute__ ((__always_inline__))才可以,不内联的情况下会失败

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1088956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX