C++ 成功时返回值非零的WINAPI方法

C++ 成功时返回值非零的WINAPI方法,c++,winapi,C++,Winapi,对于许多WINAPI方法,返回值为0(失败)或非零(成功)。例如: 返回值 如果函数成功,则返回值为非零。 如果函数失败,则返回值为零 我的问题是,对于这种方法,使用TRUE(即BOOL值等于1)测试返回值是否正确?或者测试返回值是否为!是否改为FALSE 另一个不相关的问题是,当返回值为非零时,它到底是什么?它可以是任何值或一组值吗?您提到的方法的签名是: BOOL WINAPI DeleteTimerQueue(_In_ HANDLE TimerQueue); 在Windows标题中,类

对于许多WINAPI方法,返回值为0(失败)或非零(成功)。例如:

返回值

如果函数成功,则返回值为非零。 如果函数失败,则返回值为零

我的问题是,对于这种方法,使用
TRUE
(即
BOOL
值等于1)测试返回值是否正确?或者测试返回值是否为
!是否改为FALSE


另一个不相关的问题是,当返回值为非零时,它到底是什么?它可以是任何值或一组值吗?

您提到的方法的签名是:

BOOL WINAPI DeleteTimerQueue(_In_ HANDLE TimerQueue);
在Windows标题中,类型
BOOL
定义为
int
。这是出于历史原因,因为在C99之前的日子里,没有我们现在熟悉的
bool
类型,WinAPI一直在为后面介绍的许多方法使用bool定义

此外,Windows标题与此非常相似,如果我们冒昧地简化一下

typedef int   BOOL
#define FALSE 0  // < note that #define <number> introduces an integer constant
#define TRUE  1

它说的是非零。这绝不意味着
TRUE
。如果文档说非零返回意味着“OK”,那么这就是你所知道的——如果不同的值意味着任何可以依赖的东西,那么它将被记录下来——或者至少如果它没有被记录下来,你应该忽略这种可能性。我几乎总是按照
If测试返回值(!SomeFunction())
注意这一点:一些WINAPI方法返回0表示失败,另一些方法返回0表示成功。检查0而不是将所有人都与FALSE混淆会更清楚。如果您使用的是API,并且接口需要BOOL结果,那么请务必使用TRUE和FALSE。因此,总而言之,我应该将其检查为
!FALSE
if(!DeleteTimerQueue(handle)) {
    /* handle the error case */
    /* call GetLastError() where applicable */
}
/* otherwise proceed, the call succeeded */