Я нахожусь на ранних стадиях создания материала для нового проекта.
Я определил функцию с возвращаемым типом "bool"
Я получил этот вывод от PC-Lint
Including file sockets.h (hdr)
bool sock_close(uint8_t socket_id);
^
"LINT: sockets.h (52, 1) Note 970: Use of modifier or type '_Bool' outside of a typedef [MISRA 2012 Directive 4.6, advisory]"
Я пошел дальше и определил это в другом заголовке, чтобы закрыть lint:
typedef bool bool_t;
Тогда я начал задаваться вопросом, почему я должен был это сделать и почему это что-то изменило. Обратился к MISRA 2012 Dir 4.6. В основном это касается ширины примитивных типов, таких как short, int и long, их ширины и того, как они подписаны.
Стандарт не дает никакого расширения, рационального, исключения или примера для логического значения.
bool явно определен как _Bool в stdbool.h в C99. Так действительно ли этот критерий применим к bool?
Я думал, что _Bool явно всегда был «наименьшим стандартным целочисленным типом без знака, достаточно большим для хранения значений 0 и 1» в соответствии с разделом 6.2.5 C99. Итак, мы знаем, что bool не имеет знака. Значит, проблема в том, что _Bool не имеет фиксированной ширины, а тема каким-то образом продвигается? Потому что рациональное, казалось бы, противоречит этому понятию.
Соблюдение этого правила не гарантирует переносимости, поскольку размер типа int может определять, подлежит ли выражение целочисленному расширению.
Как простое добавление typedef bool bool_t;
что-то меняет, потому что я ничего не делаю, чтобы указать ширину или подписанность при этом? Ширина bool_t также будет зависеть от платформы. Есть ли лучший способ переопределить bool?
Тип не должен быть определен с определенной длиной, если только реализованный тип не имеет такой длины.
поэтому typedef bool bool8_t;
должно быть совершенно незаконным.
Ошибается ли Gimpel в своей интерпретации Директивы 4.6 или они правы?
bool
(определенный в<stdbool.h>
— это макрос, который расширяется до_Bool
, а не typedef. Ширина и подписьbool
/_Bool
не должны иметь значения, если вы используете их правильно; если MISRA действительно рекомендует не использовать его (в то время как разрешая ваш typedef), это кажется глупым. - person Keith Thompson   schedule 03.06.2015typedef uint8_t bool_t;
- person Nick   schedule 03.06.2015<stdbool.h>
и добавлениеtypedef _Bool bool;
сработает. - person Keith Thompson   schedule 03.06.2015#define bool _Bool
Как только все это будет сказано и сделано, я буду совершенно счастлив, используяtypedef bool bool_t;
, я просто хотел бы знать, зачем это нужно. - person Nick   schedule 03.06.2015_Bool
, а не кbool
, которое появляется в источнике). Выбор C99 сделатьbool
макросом, а не typedef, ИМХО сомнительный. Лично я не хотел бы изобретать имяbool_t
, а не использовать стандартноеbool
, даже если мне придется определятьbool
самому. Я мог бы сделать что-то вродеtypedef _Bool bool; enum { false, true};
, чтобы избежать использования макросов. - person Keith Thompson   schedule 03.06.2015