3

我正在审查 C 的编码指南,我们仍然有typedef uint8_t布尔值的指南。我在一家汽车行业的公司工作,因此从事嵌入式软件工作,并且通常使用 Renesas 微处理器和 GreenHills 编译器。

我认为由于 C99 已经存在这么多年,类型定义是多余的,我希望现代平台的所有编译器都支持_Bool. 那么,它还值得拥有typedef吗?

额外的问题:我正在尝试为 C++ 整理一些指南。我使用 C++ 的背景相对有限,但我再次认为typedefforbool根本不应该是有益的。我们应该使用基本的 C++bool类型还是有什么理由应该使用自定义的typedefT_BOOL 来代替?

4

3 回答 3

1

很简单:

  • 如果您使用的是标准 C,则使用boolstdbool.h。_Bool也很好。丑陋的 typedef 是不好的,也是不好的做法。
  • 如果您被迫使用旧的 C90,则必须使用某种丑陋的 typedef。

假设 C90:

为布尔类型定义使用 8 位类型绝对没有害处。8 位类型将节省一点 RAM。可以这样做:

typedef uint8_t BOOL;
#define FALSE 0u
#define TRUE  1u

然而,最常见的形式可能是typedef enum { FALSE, TRUE } BOOL;.

永远不要使用全部小写!因为bool,falsetrue如果您移植到标准 C 编译器,将与标准冲突。

所有这些自制的形式都是不好的做法,也是一种过时的 C 编写方式。没有任何借口可以坚持使用危险的 C90,尤其是在对安全至关重要的汽车系统中。

至于 MISRA-C:2012,它只是声明你应该有某种布尔类型。它保持与 C90 的向后兼容性,因此不强制执行bool. 然而,它有很多关于如何处理布尔类型的规则,并防止将它们与各种形式的算术一起使用。


为了与 C++ 兼容,您绝对应该使用标准 C bool。该类型在设计时明确考虑了 C++ 兼容性。

于 2019-11-08T07:48:44.350 回答
0

对于新代码,确实没有理由重新定义标准类型 - 在我们公司,我们要求使用 booltruefalse,因为它会阻止不同的团队和开发人员开发他们自己的(有时稍微不兼容的)这些类型的变体。

对于必须处理先前声明的 bool/true/false 的旧代码,可能来自遗留框架,有时将现有类型别名(通过 typedef 或 #define)到 _Bool 中很有用。这通常是框架而不是特定程序的问题。示例包括 X11 (Boolean) , Xt (_XtBoolean), ...

我相信同时包含 _Bool 和 bool 的原因是允许已经创建“bool”的现有代码继续工作,而无需由于引入“标准”bool、false 和 true 而进行代码更改。

于 2019-11-07T12:48:03.417 回答
-2

在您(ab)使用 C 提升规则将布尔值存储在比较运算符提供的表达式类型之外的任何内容中的那一刻,即int您处于罪恶状态。更严肃的一点是:我无法想象存储布尔信息的类型会很重要的情况,除了大量大量的布尔值,并且编写了很多汽车软件的关键任务部分,我几乎无法想象这样的数据结构会有用的情况。我曾经处理过的几乎所有带有是/否决定的信息也带有一堆相关数据,因此自然存储方案是一个结构。无论当前的 MISRA 标准对此有何评论,我从不回避位域(如果您戴着“理智的安全软件专家”的帽子仔细考虑反驳的话,针对它们的案例就会化为乌有)。如果不是这种情况,它是一些全局标志,因此存储格式的大小无关紧要。所以问题是,剩下的哪些应用程序对布尔值的存储格式很重要?我能想到的唯一一个是堆栈大小,或者更确切地说,如果您没有选择最小的可用大小,则无法仅在寄存器中使用参数进行调用。这立即引发了两个反驳:具有许多松散耦合的布尔参数的函数非常可疑,即使它们存在,性能和内存消耗也不应该以任何方式依赖于它们(如果它们是瓶颈,那也是非常可疑的)。如果你有一个到处都是布尔值的调用层次结构,那么最大堆栈大小可能会有一点优势,但这是 IME,而不是微优化的地方。性能和内存消耗都不应该以任何方式依赖于它们(如果它们是瓶颈,那也是非常可疑的)。如果你有一个到处都是布尔值的调用层次结构,那么最大堆栈大小可能会有一点优势,但这是 IME,而不是微优化的地方。性能和内存消耗都不应该以任何方式依赖于它们(如果它们是瓶颈,那也是非常可疑的)。如果你有一个到处都是布尔值的调用层次结构,那么最大堆栈大小可能会有一点优势,但这是 IME,而不是微优化的地方。

给出一个 TL;DR 的答案:格式不应偏离您团队中的(新)程序员所期望的,这很可能是过去十年中广泛使用/标准的格式。如果您的布尔值的存储类型真的那么重要,我完全不问,敢于远程诊断软件构建问题。

于 2019-11-07T18:08:46.713 回答