browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

BOOL 与 int

Posted by on 2010 年 03 月 24 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

今天群里讨论问题的时候,引出了一个有关 Win32 API GetMessage 的话题。
首先,看看它的声明:

1
2
3
4
5
6
BOOL GetMessage(
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax
);

但是,在 MSDN 的解释中却补充了这么一句:

> If there is an error, the return value is -1.

这就是说,GetMessage 的返回值有三种可能:非零、零及 -1。换句话说,尽管 GetMessage 的返回值是 BOOL 类型的,但它早已超越了一个布尔所代表的意义。
可能有人说了:这没什么不可以的,因为在 Win32 SDK 之中,BOOL 实际上是 int 的别名:

1
2
// WinDef.h
typedef int BOOL;

——如果这真的没什么不可以的,那么我这么写也一定可以了?

1
2
3
4
BOOL GetMaxValueBetweenTwoInts(int a, int b)
{
    return a > b ? a : b;
}

不得不承认,这是一个极其糟糕的函数定义——BOOL 在这里不仅没有起到它本身应有的说明作用,而且还容易把调用者弄晕。
话又说回来,虽然 BOOL 的本质仍是一个 int,但你认为那个 typedef 的用意又是什么?
当然是告诉你,这虽然是个 int,但它只会代表零或非零。

订阅本站

3 Comments

  • At 2010.04.05 14:10, Магсн said:

    其实,什么东西都用long来传不就好了么,省时省力。。。
    ps.AX,EAX,RAX,以后的long那么大……

    • At 2010.05.06 17:11, jadedrip said:

      微软定义 BOOL 就是为了能作为 3态使用,否则直接用 bool 不就行了?

      • At 2010.05.06 19:09, 李马 said:

        我不这么认为,所谓“布尔”本身就意味着这个类型只有两态的取值。至于为什么不直接用 bool,是因为 Win32 SDK 还要给 C 来使用。

        (Required)
        (Required, will not be published)