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