C++ 为什么返回Windows BOOL数据类型而不是int?
从 它声明如下: “如果函数检索的消息不是C++ 为什么返回Windows BOOL数据类型而不是int?,c++,windows,C++,Windows,从 它声明如下: “如果函数检索的消息不是WM_QUIT,则返回值为非零。 如果函数检索WM_QUIT消息,则返回值为零。 如果有错误,则返回值为-1 boolean值不是true还是false?。这里似乎有三个选项,true,false,和oopsie\u daisy 因此,在键入此内容时,我想我应该检查一下WinDef.h,在其中我发现: typedef int BOOL 嗯 BOOL只是一个int 那么这到底是为了什么呢?这是不是又一个时代错误,就像我们发现Windows API到
WM_QUIT
,则返回值为非零。
如果函数检索WM_QUIT
消息,则返回值为零。
如果有错误,则返回值为-1
boolean
值不是true
还是false
?。这里似乎有三个选项,true
,false
,和oopsie\u daisy
因此,在键入此内容时,我想我应该检查一下WinDef.h
,在其中我发现:
typedef int BOOL代码>
嗯
BOOL
只是一个int
那么这到底是为了什么呢?这是不是又一个时代错误,就像我们发现Windows API到处都是一样
为什么GetMessage()
不返回int
值
我知道最终这并没有什么不同,我只是好奇是否有人有答案,因为最近它一直困扰着我
多谢各位
附言:
关于我的oopsie\u daisy
备注,我意识到它可以是任何整数值,我是在函数有3个选项的上下文中说的,而不是BOOL只有3个可能的值。请参见旧的新事物:
最初,Get-Message函数没有故障模式。如果您传递了无效的参数,那么您调用了未定义的行为,可能会崩溃
因此,最初,GetMessage返回TRUE或FALSE。因此,选择BOOL
在当时是完全合理的
至于为什么签名在行为改变时没有改变,这可能只是惯性和/或向后兼容性。BOOL
表示在正常情况下,没有参数错误,根据通常的C约定0=false,该值可以解释为布尔值,因为它最初用于GetMessage
:
ECMA-234§8.3:
“如果检索到WM_QUIT以外的消息,则GetMessage()函数的返回值为TRUE。如果检索到WM_QUIT消息,则返回值为FALSE
当GetMessage
被更改为同时返回一个错误指示器时,为什么这一点没有更改,可能无法回答
注:
¹
提示:Windows API是1981-1990年间发明的bool
于1999年添加到C中。(奇怪的是,C++自从1989以来就有了<代码> Boo.<代码>),这对于面向对象代码来说并不少见: >真< /COD>,<代码> false <代码>是一个运行良好定义过程的输出,错误是其余的。例如,在Java中,对象布尔值可以是null
,0或1。强制性问题:谁在乎<已知code>BOOL
是int
的typedef
。返回BOOL
的API记录了可能返回值的含义,大多数API仅区分0
和非0
。所以,除了美学之外,没什么大问题。[编辑]尽管如此,我不理解反对票。对我来说,这听起来像是一个完全合法的winapi
问题。我认为投票被否决是因为这个问题只能由决定使用BOOL
而不是int
的人来回答。任何人的尝试都只是猜测。向后兼容性是windows中许多怪癖的原因。嗯,至少我不是唯一一个觉得它奇怪的人。
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg,
_In_opt_ HWND hWnd,
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax
);