为什么我的宏中的“\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@ChrisDodda
是一个DynamicArray*
,它是一个典型的结构。它的类型与它所保存的数据不匹配。或者我误解了你的意思吗?@PeterVaro:我在回答中添加了一个建议。@KeithThompson真是太棒了,你真是个天才,谢谢!一个复合文字会更通用\u Generic((type){0},…