代码之家  ›  专栏  ›  技术社区  ›  AhSeng Fan

C泛型错误-“_Bool”之前应为表达式

  •  2
  • AhSeng Fan  · 技术社区  · 9 年前

    我正在学习C语言。 问题是: 为什么我不能成功编译下面的代码? 它只会将错误作为标题发布。

    #include <stdio.h>
    #define EVALUATE(X) _Generic((X), _Bool : "boolean", default : "not boolean")
    
    int main(void)
    {
        printf("%s\n", EVALUATE(5));
    
        return 0;
    }
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   Bill Lynch    9 年前

    _Generic gcc中不支持 until 4.9.0 . _Bool 当前编译器支持,但由于编译器认为 _通用 是一个正则隐式函数,它会发出关于奇数参数的警告。

    一般条款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’
    

    一般条款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));
                        ^
    

    一般条款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
    
        2
  •  0
  •   Vlad from Moscow    9 年前

    您的编译器似乎不支持类型 _Bool 。可以通过声明类型为的变量来检查这一点 _布尔 例如

    _Bool b = 1;
    
    printf( "%d\n", b );
    

    至于通用,则替换 _布尔 具有 int .

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