可能我在这里犯了一些非常基本的错误,但我无法弄清楚那可能是什么。我可以解释一下我的代码片段,但我认为我在这里尝试做的很明显:创建一个类型泛型的宏重载" print function"对于我的DynamicArray
dynarr_printf
方法。问题是:为什么它不起作用?
提前致谢!
ENV:
// Mac OS X 10.9.2
// Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
cc -Wall -v -g -std=c11 -I/usr/local/include -c -o build/tmp/main.o main.c
CODE:
void
__dynarr_printf(DynamicArray *dynarr,
void (*print_func)(int, void*));
#define __line_fmt__(fmt) " [%d] " fmt "\n"
static inline void
__dynarr_printf_i(int i, int *v)
{
printf(__line_fmt__("%d"), i, *v);
}
// tons of type specific functions ...
static inline void
__dynarr_printf_def(int i, void *v)
{
printf(__line_fmt__("ptr(%p)"), i, v);
}
#define __dynarr_typef(type) _Generic((type), int: __dynarr_printf_i, \
// tons of type specific funcs ...
default: __dynarr_printf_def)
#define dynarr_printf(dynarr, type) \
(__dynarr_printf(dynarr, __dynarr_typef(type)))
输出:
main.c:102:5: error: expected expression
dynarr_printf(dynarr, float);
^
./dynarr.h:168:31: note: expanded from macro 'dynarr_printf'
(__dynarr_printf(dynarr, __dynarr_typef(type)))
^
./dynarr.h:157:45: note: expanded from macro '__dynarr_typef'
#define __dynarr_typef(type) _Generic((type), int: __dynarr_printf_i, \
^
1 error generated.
答案 0 :(得分:4)
通用选择的语法是:
_Generic
(
assignment-expression ,
< em> generic-assoc-list )
(有关 generic-assoc-list 的定义以及有关通用选择的更多信息,请参阅N1570第6.5.1.1节。)
第一个“操作数”是表达式,而不是类型名称。它选择该表达式的类型。
如果类型始终为标量,则可以更改
_Generic((type), ...)
到
_Generic((type)0), ...)