【问题标题】:Why BOOL in Windows is of type int?为什么 Windows 中的 BOOL 是 int 类型?
【发布时间】:2017-07-01 17:56:28
【问题描述】:

为什么不将BOOL 定义为enum,例如:

enum BOOL {FALSE, TRUE};

为什么必须明确BOOL指定为int(或任何其他整数类型)?

【问题讨论】:

  • 趣事:有WINAPI functions返回BOOL,但返回值必须检查为零、非零和-1。
  • 我认为正确的问题是“为什么BOOLint 而不是shortunsigned short”。不要认为enum 更好——这不是 Pascal 也不是 C++。
  • @i486,更好的是,char。不需要 16 或 32 位来判断真假。
  • 拒绝我的天才,你能说为什么吗?你知道@Remy Lebeau 的答案吗?我的问题提出了另一个有趣的问题,例如为什么是 int 而不是 char,你知道为什么吗?

标签: c windows winapi


【解决方案1】:

来自 Raymond Chen 关于此主题的博客文章:

BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

同样的事情还有更多的说法。为什么这么多?

因为每个都是由不同的人在不同的时间发明的,以解决不同的问题。

BOOL 是最老的。它的定义很简单

typedef int BOOL;

C 编程语言使用“int”作为其布尔类型,而 Windows 1.0 是在 C 是系统编程的酷语言时写回的

到目前为止,绝大多数 Win32 API 仍然是为 C 设计的,因此它可以兼容大量与 C 兼容的编程语言。

枚举存在跨编译器的可移植性问题,这与字节大小和位表示的差异有关。此外,enum 直到 1989 年的 ANSI C(又名 C98)才被添加到 C 中,那是在 Windows 的三个版本(1985 年的 1.0、1987 年的 2.0 和 1988 年的 2.1)之后,枚举实际上等同于整数无论如何。

【讨论】:

  • 这是一个有趣的问题,不过,为什么不对char 进行类型定义以使其在 1 字节而不是 2(或 4)字节上签名?
  • @Ra'Jiska 将其设置为 char 不会非常有益,因为在比较等情况下它仍会升级为 int
  • @RemyLebeau 即使与另一个字符比较?
  • @BiteBytes 比较运算符通常在计算值之前将值提升为 int。
  • 有什么与 Win API 相关的东西不能通过引用 Raymond 来回答吗?可能不多... ;)
【解决方案2】:

原因是 C 本来就没有 bool 类型。根据 C 语言规范,任何非零整数值的计算结果为真,而 0 的计算结果为假。 BOOL typedef 是微软后来为 Windows 编程添加的。枚举仍将在幕后评估为 0 和 1(或其他取决于机器的东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2012-12-28
    • 2018-06-26
    • 2021-09-22
    • 2016-07-08
    相关资源
    最近更新 更多