你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 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,但它只会代表零或非零。
其实,什么东西都用long来传不就好了么,省时省力。。。
ps.AX,EAX,RAX,以后的long那么大……
微软定义 BOOL 就是为了能作为 3态使用,否则直接用 bool 不就行了?
我不这么认为,所谓“布尔”本身就意味着这个类型只有两态的取值。至于为什么不直接用 bool,是因为 Win32 SDK 还要给 C 来使用。