有人可以解释 C++ FAILED 函数吗?

Posted

技术标签:

【中文标题】有人可以解释 C++ FAILED 函数吗?【英文标题】:Can someone explain the c++ FAILED function? 【发布时间】:2008-12-18 09:23:15 【问题描述】:

我见过很多将函数调用包装在 FAILED() 函数/方法/宏中的示例 C++ 代码。 有人可以向我解释这是如何工作的吗?如果可能的话,有人知道 c# 等价物吗?

【问题讨论】:

【参考方案1】:

它通常检查 COM 函数错误。但是检查任何返回 HRESULT 的函数就是它的意义所在。如果HRESULT 值为负,则FAILED 返回一个真值,这意味着函数失败(“错误”或“警告”严重性)。 S_OKS_FALSE 都 >= 0,因此它们不用于传达错误。 “负数”是指为HRESULT 错误代码设置高位,,它们的十六进制表示,可以在 例如,winerror.h 中找到, 以 8 开头,如 0x8000FFFF。

【讨论】:

【参考方案2】:

This page 显示定义 FAILED() 的 WinError.h 包含文件的一半。它实际上只是一个非常简单的宏,整个定义是这样的:

#define FAILED(Status) ((HRESULT)(Status)<0)

【讨论】:

【参考方案3】:

如果可能的话,有人知道 c# 等价物吗?

在 C# 中实际上不需要它,除非您使用的是 COM 对象。大多数 .NET 函数要么已经返回(或多或少)有意义的值(即 null、false),要么在失败时抛出异常。

如果您直接访问 COM 对象,您可以定义一个简单的 Failed 函数,该函数执行 unwind 帖子中的宏所做的事情。在本地定义(受保护/私有),因为杂乱无章的 COM 详细信息无论如何都不应该在您的应用中可见。

如果您不知道,COM 中还有一个 SUCCEEDED 宏。无需测试失败:)

【讨论】:

太棒了!但是如果我调用的 com 方法返回 void 怎么办?在这种情况下我可以测试什么? 一个返回 void 的 COM 函数!?在哪里?哪一个? 我认为托管 Directx 库实际上是一个 com 包装器是否正确?还是我完全错了? (因为几乎每个方法都返回 void!!) MDX,如果我没记错的话,应该不再使用了。您可能想改用 XNA。无论如何,返回 void 的函数很可能通过抛出异常来表示失败。 MDX 是一个精简的 COM 包装器。所以它隐藏了实际的 COM 细节,同时保持大致等价,这可能是方法返回 void 的原因。

以上是关于有人可以解释 C++ FAILED 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下这个 c++ 代码有啥问题并提供解决方案吗

有人可以在这里解释冒号的功能吗? [复制]

有人可以解释这个递归函数吗? [关闭]

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?

有人可以从howtonode解释一个包装成语的函数吗?

交叉和计算,有人可以解释一下代码吗?