C _Generic error - ожидаемое выражение перед _Bool

Я узнаю о 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 ответа

Решение

_Generic не поддерживается в gcc до 4.9.0. _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

Похоже, ваш компилятор не поддерживает тип _Bool, Вы можете проверить это, объявив переменную типа _Bool, Например

_Bool b = 1;

printf( "%d\n", b );

Что касается общего тогда заменить _Bool с int,

Если после такой замены код не будет скомпилирован, это означает, что компилятор не поддерживает generic.:)

Другие вопросы по тегам