【发布时间】:2018-06-05 07:01:41
【问题描述】:
我喜欢重载一个 C 函数。我发现以下内容:Function overloading in C using GCC - functions with mutiple arguments。这很好用,但现在我想根据两个参数的类型来选择函数。
#define dataioWriteBin(file, data, len) \
(__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint8_t ) && __builtin_types_compatible_p(typeof(len), uint64_t ), dataioWriteBin_uint8Data_uint64Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint8_t ) && __builtin_types_compatible_p(typeof(len), uint32_t ), dataioWriteBin_uint8Data_uint32Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint32_t ) && __builtin_types_compatible_p(typeof(len), uint64_t ), dataioWriteBin_uint32Data_uint64Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint32_t ) && __builtin_types_compatible_p(typeof(len), uint32_t ), dataioWriteBin_uint32Data_uint32Len, \
(void)0))))(file, data, len))
但是使用这段代码我得到了一个编译错误:
错误:被调用的对象不是函数或函数指针 (__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint8_t)
任何人都有一个想法,难道不可能同时发送两个论据吗?构造本身也可以工作。它失败了,我用 uint32_t 数据和 uint32_t 长度调用函数。使用 uint8_t 的函数调用正在运行。
感谢您的帮助。
【问题讨论】:
-
“我喜欢重载一个 C 函数”。为什么?可能有有效的案例,但您最好在考虑这一点之前先做好自己的案例。
-
在这方面有比 C 更好的工具。 "Birmingham screwdriver" 似乎很合适。