gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:21 24 4
gpt4 key购买 nike

可能我在这里做错了一些非常基本的事情,但我无法弄清楚那可能是什么。我可以解释我的代码片段,但我认为我在这里尝试做的事情非常明显:为我的 DynamicArraydynarr_printf 创建一个泛型宏重载“打印函数” 方法。问题是:为什么它不起作用?

提前致谢!

环境:

// 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.

最佳答案

通用选择的语法是:

_Generic ( 赋值表达式 , generic-assoc-list )

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

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

如果类型总是标量,你可以改变

_Generic((type), ...)

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

关于c - 为什么我的宏中的 `_Generic` 关键字不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com