ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1039016 Топик полностью
RxTx (22.09.2020 20:27, просмотров: 419) ответил teap0t на В учебном проекте эта библиотека не используется, но в одном из заголовочных файлов есть очень похожая запись. В проекте
MISRA ругается потому что для безопасности они не рекомендуют пользоваться обще-генеральными типами int, long итд. Какую длину в байтах будут иметь эти типы зачастую предсказать тяжело и это ведет к ошибкам. Вместо этого они рекомендуют пользоваться встроенными типами у которых в точности известен размер: <inttypes.h> 

Именно это утилита проверки MISRA-правил и пишет:

The basic types of char, int, short, long, float, and double should not be used, but specific-length equivalents should be typedef'd for the specific compiler, and these type names used in the code


В самом языке C, начиная с его версии C99 существует встроенный прям в язык тип _Bool (то есть никаких определений типа или включать другие файлы (заголовки) не надо. Но вот какая проблема, по стандарту языка, тип _Bool не гарантируется что будет иметь определенный размер в байтах. Обычно в 99% случаев он имеет размер 1 байт. Но гарантий этого по стандарту C99 нет. Вот поэтому MISRA на него и шипит. Либо на его производные, во включаемом файле <stdbool.h> находится простое макро, которое потом разворнет все bool в _Bool а также дял удобства восприятия содержит true и false.


Теперь что касается наворачивания своих самопальных boolean-типов. Не всё так просто и вот почему. Вот это:

unsigned char var = 256;

if (var) {  
}

закончится тем что var будет (0) false и код внутри if не выполнится. А вот это:

_Bool var = 256;

if (var) {  
}

приведет к выполнению кода внутри if.


Таким же образом код:

_Bool a = 3, b = 4;

if (a == b) {   
}

Считает что булева a равна b и код внутри if выполнится.


Икусственные подмены _Bool будут вести себя иначе и с ними можно хлебнуть горюшка.