C _Generic error - '_Bool'之前的预期表达式

时间:2015-03-26 13:04:07

标签: c generic-programming

我正在学习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;
}

2 个答案:

答案 0 :(得分:2)

gcc until 4.9.0不支持

_Generic。您当前的编译器支持_Bool,但由于编译器认为_Generic是一个常规隐式函数,因此它会推出有关奇数参数的警告。

GCC 4.7.1

[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’

GCC 4.8.2

[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));
                    ^

GCC 4.9.0

[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

如果在这样的替换之后代码将不会被编译,那么这意味着编译器不支持泛型。:)