为什么我的宏中的“\u Generic”关键字不起作用?

为什么我的宏中的“\u Generic”关键字不起作用?,c,macros,printf,clang,c11,C,Macros,Printf,Clang,C11,也许我在这里做错了一些非常基本的事情,但我就是不知道那可能是什么。我可以解释我的代码片段,但我认为我在这里要做的是:为我的DynamicArray的dynarr\u printf方法创建一个类型泛型宏重载“print function”。问题是:为什么它不起作用 提前谢谢 ENV: 代码: 输出: 泛型选择的语法为:

也许我在这里做错了一些非常基本的事情,但我就是不知道那可能是什么。我可以解释我的代码片段,但我认为我在这里要做的是:为我的
DynamicArray
dynarr\u printf
方法创建一个类型泛型宏重载“print function”。问题是:为什么它不起作用

提前谢谢

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
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.
(有关通用关联列表的定义和有关通用选择的更多信息,请参见第6.5.1.1节。)

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

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

_Generic((type), ...)


泛型选择的语法为:

赋值表达式
通用关联列表

// 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
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.
(有关通用关联列表的定义和有关通用选择的更多信息,请参见第6.5.1.1节。)

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

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

_Generic((type), ...)


不要对自己的标识符使用前导下划线,尤其是双前导下划线。所有这些标识符都保留给实现(即编译器和运行库)。@KeithThompson好的,谢谢你的提示,我将在我的代码库中修复它!不要对自己的标识符使用前导下划线,尤其是双前导下划线。所有这些标识符都保留给实现(即编译器和运行库)。@KeithThompson好的,谢谢你的提示,我将在我的代码库中修复它!当然,谢谢!在我的情况下,有什么样的把戏可以用吗?传递数组所包含类型的数据将非常难看..:P@ChrisDodd
a
是一个
DynamicArray*
,它是一个典型的结构。它的类型与它所保存的数据不匹配。。还是我误解了你的话?@PeterVaro:我在回答中加了一个建议。@KeithThompson太棒了,你是个天才,谢谢!复合文字将更通用
\u Generic((type){0},…
当然,谢谢!在我的情况下,有什么窍门可以用吗?传递数组中包含的类型的数据会很难看P@ChrisDodd
a
是一个
DynamicArray*
,它是一个典型的结构。它的类型与它所保存的数据不匹配。或者我误解了你的意思吗?@PeterVaro:我在回答中添加了一个建议。@KeithThompson真是太棒了,你真是个天才,谢谢!一个复合文字会更通用
\u Generic((type){0},…