有人可以解释 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_OK
和 S_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 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章