Я переношу приложение, которое разрабатывал в CodeWarrior v5.2, на Keil uVision v5.25, в котором используется компилятор ARM C v5.06.
В моем коде я использовал bool
для представления логических значений, которые определены в файле types.h
в моем проекте как:
typedef enum _bool
{
false = 0,
true = 1
} bool;
Когда я пытаюсь скомпилировать свой код, компилятор выдает предупреждения о строках, где я неявно присваиваю результат сравнений переменным с таким типом:
src\c\drivers\motor.c(168): warning: #188-D: enumerated type mixed with another type
const bool motorStopped = timeSinceLastEvent > maxPulseWidth;
src\c\drivers\motor.c(169): warning: #188-D: enumerated type mixed with another type
const bool motorStalled = motorStopped && isMotorDriven();
Я понимаю, почему эти предупреждения генерируются. Я знаю, что могу подавить эти предупреждения, явно приведя к bool
, например:
const bool motorStopped = (bool)(timeSinceLastEvent > maxPulseWidth);
Однако делать это для каждого логического условия довольно некрасиво. Мне было интересно, есть ли способ настроить компилятор Keil uVision/ARM (или изменить мой код), чтобы он не генерировал предупреждения о bool
, без прямого отключения предупреждений о смешивании перечислимых типов с другими типами.
Вот варианты, которые у меня есть для настройки компилятора:
bool
может привести к нарушению стандартного совместимого кода. - person too honest for this site   schedule 18.07.2018typedef unsigned char boolean;
вместе сTRUE
иFALSE
. Переключение всех моихbool
наboolean
кажется лучшей идеей. - person Tagc   schedule 18.07.2018types.h
нет, возможно, на то есть причина. Если есть, то он должен работать с компилятором и соответствовать стандарту. - person too honest for this site   schedule 18.07.2018bool
, определенный в этом файле, также используется во многих SDK, и если бы я использовал тип, определенный вstdbool.h
, он бы затенил его. В противном случае я бы использовал stdbool.h. - person Tagc   schedule 18.07.2018types.h
, который включается в проект. hastebin.com/rocosaraji.c - person Tagc   schedule 18.07.2018stdbool.h
недоступен в C89, и поэтому они, возможно, сами определили его, чтобы типbool
был доступен независимо от того, какой стандарт C используется. Я определил подобное перечисление, когда работал с другим микро с CodeWarrior 5.2 и был вынужден использовать C89. - person Tagc   schedule 18.07.2018