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.:)