在嵌入式系统中使用"stdbool.h"

4
我正在阅读关于嵌入式系统的C编码风格,我发现了以下陈述:

不要使用stdbool.h库。分别使用1或0表示true或false

这个陈述是在以下来源中写的: https://github.com/MaJerle/c-code-style 然而,没有解释为什么要使用这种方式,也没有说明采用这种风格的优缺点。
我想知道使用1或0代替true或false是否有任何优势。

3
总体来说,这似乎是一个大部分合理的编码标准,尽管有些东西显然是毫无理由地随意取出来的。我唯一能想到的避免使用stdbool.h的原因是与C90的向后兼容性有关。但在这里似乎并不需要这个要求? - undefined
5
价值可疑。不一致。char a; char b; /* 错误 */char a, b; /* 正确 */...然后,当涉及到指针时,"始终将星号与类型对齐"导致char* a, b;,而b应该是一个指针。规则,嗯? - undefined
2
@thebusybee 对于嵌入式系统来说,stdbool.h是合适的并不是一种观点,而是一个事实。它是一个强制性的头文件,即使是“独立运行”的系统也必须支持,所以如果没有这个头文件,C编译器就是不符合规范的。 - undefined
1
@Fe2O3 还有,我几乎可以发誓MISRA C规则禁止在一行上有多个声明,但我找不到相关规定。MISRA C明确表示它不是一个主观的样式指南,而是一个禁止危险做法的安全子集。 - undefined
@Lundin 我从来没有怀疑过 "stdbool.h" 的适用性。 - undefined
显示剩余5条评论
2个回答

6
我想知道使用1或0代替true或false是否有任何优势。
没有。在嵌入式系统中使用stdbool.h是可以的。
请注意,旧的编译器可能没有提供stdbool.h,但这不应该是你不使用的原因,因为你提供的指南也建议使用stdint.h类型(这本身就是一个好建议)。而且,你不应该使用过时的编译器。

5
关于 stdbool.h 的特点,可以说以下几点:
  • 它是所有 C 编译器必须支持的强制性头文件之一,包括嵌入式编译器。来源:ISO 9899:2018 第4章第6节。
  • 它不被早已过时的 C90("ANSI C")支持。不使用该头文件,而使用 1/0 的主要原因是与 C90 的向后兼容性。
  • 即将发布的 C23 让 stdbool.h 变得不再必要(但尚未正式弃用),因为在 C23 中,booltruefalse 终于成为了合法的关键字。同时,_Bool 仍然可用。

此外,编码风格还有以下规则:
- 不允许使用以//开头的注释。这也意味着需要兼容C90,因为这是不允许使用这种注释的唯一原因(它们是在C99中引入的)。
- 不要在第一个可执行语句之后声明变量。同样,这也是为了兼容C90,否则没有任何意义。
因此,我可以得出结论,很多这些规则是为了兼容C90,否则就无法理解它们的意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接