我正在学习C _Generic。 这是个问题: 为什么我无法成功编译以下代码? 它只会将错误作为标题发出。
#include <stdio.h>
#define EVALUATE(X) _Generic((X), _Bool : "boolean", default : "not boolean")
int main(void)
{
printf("%s\n", EVALUATE(5));
return 0;
}
答案 0 :(得分:2)
_Generic
。您当前的编译器支持_Bool
,但由于编译器认为_Generic
是一个常规隐式函数,因此它会推出有关奇数参数的警告。
[9:25am][wlynch@apple /tmp] /opt/gcc/4.7.1/bin/gcc -std=c11 foo.c
foo.c: In function ‘main’:
foo.c:7:5: warning: implicit declaration of function ‘_Generic’ [-Wimplicit-function-declaration]
foo.c:7:20: error: expected expression before ‘_Bool’
[9:26am][wlynch@apple /tmp] /opt/gcc/4.8.2/bin/gcc -std=c11 foo.c
foo.c: In function ‘main’:
foo.c:7:5: warning: implicit declaration of function ‘_Generic’ [-Wimplicit-function-declaration]
printf("%s\n", EVALUATE(5));
^
foo.c:3:35: error: expected expression before ‘_Bool’
#define EVALUATE(X) _Generic((X), _Bool : "boolean", default : "not boolean")
^
foo.c:7:20: note: in expansion of macro ‘EVALUATE’
printf("%s\n", EVALUATE(5));
^
[9:26am][wlynch@apple /tmp] /opt/gcc/4.9.0/bin/gcc -std=c11 foo.c
[9:27am][wlynch@apple /tmp] ./a.out
not boolean
答案 1 :(得分:0)
您的编译器似乎不支持类型_Bool
。您可以通过声明_Bool
类型的变量来检查这一点。例如
_Bool b = 1;
printf( "%d\n", b );
对于通用,然后将_Bool
替换为int
。
如果在这样的替换之后代码将不会被编译,那么这意味着编译器不支持泛型。:)