如何使用_Generic定义使用C输入的一般函数?

时间:2016-10-17 14:51:18

标签: c generics gcc c11

我试图在C中定义一个使用_Generic获取输入的通用函数,这就是我写的

#include  <stdio.h>

#define readlong(x) scanf("%lld",&x);
#define read(x) scanf("%lld",&x);

#define scan(x) _Generic((x), \
long long: readlong, \
default: read \
)(x)

但是当我在gcc 5.3.0上使用gcc test.c -std=C11编译它时,我收到错误:

error: 'readlong' undeclared (first use in this function)

2 个答案:

答案 0 :(得分:0)

readlong

不是您声明的变量。在:

#define readlong(x) scanf("%11d",&x);

你添加了(x)。如果没有它们,这将不允许你使用readlong。

答案 1 :(得分:0)

您可以将助手定义为函数而不是宏。我修改了scan,以便将地址传递给匹配的函数。

static inline int readlong (long long *x) { return scanf("%lld", x); }
static inline int readshort (short *x) { return scanf("%hd", x); }
static inline int unknown (void) { return 0; }

#define scan(x) _Generic((x), \
long long: readlong, \
short: readshort, \
default: unknown \
)(&x)