В ответах на этот вопрос указано, что скаляры могут быть преобразованы в _Bool
и что результирующее целочисленное значение _Bool
будет 0
или 1
.
Принятый ответ на этот вопрос указывает, что указатели являются скалярами.
Является ли ошибка неявного преобразования указателя в _Bool
ошибкой компилятора?
E.g.:
$ cat ./main.c
// main.c
#include <stdbool.h>
int main( int argc, char* argv )
{
int i;
int* p = &i;
bool foo = (bool)p;
bool bar = p;
return 0;
}
Сбойный компилятор (один из одного):
$ /path/to/mips_fp_le-gcc --version
2.95.3
$ /path/to/mips_fp_le-gcc ./main.c
./main.c: In function `main':
./main.c:10: incompatible types in initialization
Проходящий компилятор (один из многих):
$ gcc --version
gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc ./main.c
$
Обратите внимание, что только неявное преобразование, а не приведение (явное преобразование) помечается проблемным компилятором как ошибка.
Также обратите внимание, что согласно комментарию к этот вопрос, компилятор отмеченной проблемы старый - с 2001 года - это может иметь отношение к тому, является ли это подлинной ошибкой компилятора. (Не зависящие от меня причины препятствуют обновлению версии кросс-компилятора с отмеченной проблемой)
gcc -std=c99
? (Он достаточно старый, поэтому по умолчанию используется-std=gnu89
, а в этом режиме<stdbool.h>
будет существовать только как расширение.) - person Keith Thompson   schedule 03.12.2019-std-c99
, он генерирует ошибкуcc1: unknown C standard 'c99'
. - person StoneThrow   schedule 03.12.2019