为什么我的宏中的`_Generic`关键字不起作用?

时间:2014-05-22 15:10:18

标签: c macros printf clang c11

可能我在这里犯了一些非常基本的错误,但我无法弄清楚那可能是什么。我可以解释一下我的代码片段,但我认为我在这里尝试做的很明显:创建一个类型泛型的宏重载" 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.

1 个答案:

答案 0 :(得分:4)

通用选择的语法是:

_Generic ( assignment-expression , < em> generic-assoc-list )

(有关 generic-assoc-list 的定义以及有关通用选择的更多信息,请参阅N1570第6.5.1.1节。)

第一个“操作数”是表达式,而不是类型名称。它选择该表达式的类型。

如果类型始终为标量,则可以更改

_Generic((type), ...)

_Generic((type)0), ...)