【问题标题】:WINAPI methods with nonzero return value at success成功时返回值非零的 WINAPI 方法
【发布时间】:2014-02-17 18:32:20
【问题描述】:

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

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682565(v=vs.85).aspx

返回值

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

我的问题是,对于这样的方法,用TRUEBOOL 的值等于 1)测试返回值是否正确?还是改为测试返回值是否为!FALSE 更正确?

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

【问题讨论】:

  • 它说非零。这绝不意味着TRUE
  • 如果文档说非零返回意味着“OK”,那么这就是你所知道的——如果不同的值意味着任何可以依赖的东西,那么它将被记录在案——或者在至少如果没有记录,你应该忽略这种可能性。
  • 我几乎总是将返回值测试为if(!SomeFunction())
  • 注意这一点:一些WINAPI方法返回0表示失败,其他返回0表示成功。检查 0 而不是用 FALSE 混淆每个人会更清楚。如果您使用 API 并且接口需要 BOOL 结果,那么请务必使用 TRUE 和 FALSE。
  • 所以总结起来我应该检查它为!FALSE?

标签: c++ winapi


【解决方案1】:

你提到的方法的签名是:

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

因此,您的问题可以解释为测试!&lt;integer&gt; 是否等同于测试布尔值。答案是肯定的,使用 C++ 测试 !0 == true!n == false 对任何整数 n &gt; 0

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

不同的 WinAPI 方法会有所不同。通常它可以是任何值,但由于返回类型在概念上是布尔值,因此可以将其作为布尔值进行测试。

所以总而言之,我应该检查它...

惯用的检查方式是:

if(!DeleteTimerQueue(handle)) {
    /* handle the error case */
    /* call GetLastError() where applicable */
}
/* otherwise proceed, the call succeeded */

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2021-12-17
    • 1970-01-01
    • 2021-05-06
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多