【发布时间】:2015-08-16 22:00:33
【问题描述】:
我正处于一个新项目框架的早期阶段。
我定义了一个返回类型为“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 在 C99 的 stdbool.h 中明确定义为 _Bool。那么这个标准真的适用 bool 吗?
根据 C99 的第 6.2.5 节,我认为 _Bool 始终是“足以存储值 0 和 1 的最小标准无符号整数类型”。所以我们知道 bool 是无符号的。那么 _Bool 不是固定宽度并且主题以某种方式被提升的事实是否只是问题所在?因为理性似乎与这个概念相矛盾。
遵守本指南并不能保证可移植性,因为 int 类型的大小可能决定表达式是否接受整数提升。
仅仅放置typedef bool bool_t; 会如何改变任何事情——因为我没有做任何事情来表明这样做的宽度或签名? bool_t 的宽度也将取决于平台。有没有更好的方法来重新定义 bool?
除非实现的类型实际上具有该长度,否则不得以特定长度定义类型
所以typedef bool bool8_t; 应该是完全非法的。
Gimpel 对指令 4.6 的解释是错误的还是他们发现了?
【问题讨论】:
-
_Bool 是 C99 中的原生类型,对于 Misra,您不能直接使用原生类型。这通常是为了代码可移植性。有时 int 是(有符号的)32 位,有时是(有符号的)16 位,例如在 8 位平台上。所以你的代码应该 typedef s32 或 s16 来明确说明你的需求
-
MISRA 没有说“不要使用本机类型”。指令 4.6 说“应该使用指示大小和符号的 typedef 来代替基本的数字类型”。我的问题是 _Bool 是否符合基本数字类型的定义。我正在查看 MISRA C 2012 的第 28-30 页,但他们没有明确说明 bool 的任何内容——尽管他们详细讨论了 stdint 中的 typedef。
-
一个数据点:
bool(在<stdbool.h>中定义的是一个扩展为_Bool的宏,而不是一个typedef。bool/_Bool的宽度和符号应该是无关紧要的只要您正确使用它;如果 MISRA 确实建议不要使用它(同时允许您的 typedef),那似乎很愚蠢。 -
@KeithThompson 同意,_Bool 是特殊的,应该优先于
typedef uint8_t bool_t; -
听起来好像省略
<stdbool.h>并添加typedef _Bool bool;会起作用。
标签: c language-lawyer c99 misra pc-lint