谁在使用 MFC 的 VERIFY 宏?

Posted

技术标签:

【中文标题】谁在使用 MFC 的 VERIFY 宏?【英文标题】:Who's using MFC's VERIFY Macro? 【发布时间】:2010-07-23 11:21:35 【问题描述】:

想一想……多年来,我一直在一个充满 MFC 的环境中愉快地编程,只要看起来不错就使用 ASSERT(),而就在今天,我(曾经)偶然发现了 VERIFY 宏: http://msdn.microsoft.com/en-us/library/fcatwy09%28v=VS.71%29.aspx

它与 ASSERT() 基本相同,除了表达式不会在发布版本中被删除(check 将被删除,但 expression 仍将被评估)。

#ifdef _DEBUG
#define VERIFY(f)          ASSERT(f)
#else   // _DEBUG
#define VERIFY(f)          ((void)(f))

我可以看到它的一些用途,但我想知道其他人是否经常在他们的代码库中使用它,是否有人看到使用它的任何不良副作用。

干杯。

【问题讨论】:

我认为更好的问题是“谁还在使用 MFC?” :p @tzaman - ;) ... MFC 是 Microsoft 唯一的官方 C++ 围绕 Windows API 的包装器。如果您使用本机 Windows GUI 应用程序,则使用 MFC。 (或 Qt,或 wxWidgets,或 gtkmm,或... :-))如果你有一个 MFC 应用程序,你就会被它困住。另外:我认为 VS 本身是用(基于)MFC 编写的。 嗯,ATL/WTL 现在已经被遗忘了? @Georg ... ATL 不会被遗忘 :-) 它不处理任何与 GUI 相关的东西(AFAIK)而且我们主要将 MFC 用于 GUI + CString。 WTL 已经死了,并且没有提供任何接近 MFC UI 类所提供的功能。 WTL 在 2004 年很有前途(我在它上面花了很多时间……),但在它上面构建现代产品是不可行的。 【参考方案1】:

我以前做MFC编程的时候一直在用。

基本上所有返回的东西我通常都懒得检查返回的东西,但是 Lint 然后对你发牢骚,我会用 VERIFY 包起来。 (例如 ::CloseHandle 之类的调用)

在已发布的产品中使用它不会有任何不利的副作用,因为无论如何它对发布版本都是无操作的。

【讨论】:

另一个问题是我们是否应该在程序中包含我们“懒得检查”的返回值。 ::CloseHandle 是一个很好的例子。【参考方案2】:

在 15 年前的第一次编程工作中,我设法大大加快了现有项目的速度。他们的代码中有大量的ASSERTs,但依赖于副作用。这意味着他们只能构建调试版本,并且他们的程序将停止在发布模式下工作。我刚刚用VERIFYs 替换了所有ASSERTs。

【讨论】:

【参考方案3】:

假设你有这样的代码:

  ...
  const int optional_return_value = AnyOldFunctionOrMethod(params);
  ASSERT(optional_return_value == 42);

这将在发布版本中提供warning C4189: 'optional_return_value' : local variable is initialized but not referenced

VERIFY 宏可以避免这种情况,方法是在 VERIFY 宏中的一行执行函数调用 + 检查(如 Will suggested in his answer),或者仅在检查行中使用 VERIFY 而不是 ASSERT。

【讨论】:

在发布构建期间可能不会弹出警告 C4189。 @Alexandre - 是“可能不是”应该是什么意思? Martin - 使用我的设置 VS2010,我必须使用 4 级警告报告并构建调试模式才能显示这些警告。他们没有出现在版本或 3 级或更低级别。也许还有其他方法可以做事,其他编译器可能有不同的默认值。

以上是关于谁在使用 MFC 的 VERIFY 宏?的主要内容,如果未能解决你的问题,请参考以下文章

VC调试小结

如何使用 mockito verify() 调用两次方法来验证方法

Python [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法

转npm 安装express npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE

MFC宏消息处理机制的原理

初识MFC----消息映射机制