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

标签 c macros printf clang c11

可能我在这里做错了一些非常基本的事情,但我无法弄清楚那可能是什么。我可以解释我的代码片段,但我认为我在这里尝试做的事情非常明显:为我的 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/

相关文章:

python - 如何为 NI VeriStand 共享库传递带有 ctypes 的数组

c - 查找句子中的回文

macros - Racket 中的宏定义宏?

Linux 操作系统类的内容

c - 为什么在用 C 计算算术时会出现此编译错误?错误 C2143 在键入之前缺少 ':'

C 宏示例

for-loop - 在 Racket /方案中展开 'for' 循环的宏?

c - %*s 格式说明符 C

c - Printf 忽略空值?

创建函数 foo(...) 的 C 语法