用到一个库,,它有一个接口函数如下:
/**
* @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, ...);
}
1
654656413245 40 天前
printf(fmt, __VA_ARGS__);
|
2
geelaw 40 天前 via iPhone 2
关键词:vprintf
|
3
XIVN1987 OP @geelaw
下面这样确实可以,,不过感觉还是不够简洁、直接。。 ``` C void ov2640_interface_debug_print(const char *const fmt, ...) { va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } ``` |
6
geelaw 40 天前
@XIVN1987 #3 好像可变参数本身就不是简洁直接的东西。
另外这也提示你应该把实现放在 void v_ov2460_interface_debug_print(char const *fmt, va_list arg); 里面,并在可变参数版本里调用它。 请注意,如果这个函数本身需要在 vprintf 之外操作可变参数列表,需要 va_copy 之,否则行为不确定。 |
7
pursuer 40 天前
我觉得 C 中缺少两个机制,一个是动态函数调用,类似 libffi 。另一个是简单的栈切换,类似 ucontext 。这两个东西依赖 C 的 ABI ,又有不少上层应用需要这个特性,特别是 ffi 。不知道会不会有一天被加入标准库。
|
8
cwxiaos 40 天前 via iPhone
用宏套一下也可以吧
|
10
codehz 39 天前
其实要用编译器扩展的话可以简单点,直接
void ov2640_interface_debug_print(const char *const fmt, ...) { printf(fmt, __builtin_va_arg_pack()); } (仅限于 gcc ,嵌入式的话可以不考虑别的编译器 不过还是不建议这么写 |
11
codehz 39 天前
哦忘了,那玩意得加__attribute__ ((__always_inline__))才可以,不内联的情况下会失败
|