谁在使用MFC的VERIFY宏?

4
想想看……我已经在一个充斥着MFC的环境中愉快地编程了多年,每当合适时就使用ASSERT(),而今天我偶然发现了VERIFY宏:http://msdn.microsoft.com/en-us/library/fcatwy09%28v=VS.71%29.aspx。它基本上与ASSERT()相同,只是表达式在发布版中不会被删除(检查将被删除,但表达式仍将被评估)。
#ifdef _DEBUG
#define VERIFY(f)          ASSERT(f)
#else   // _DEBUG
#define VERIFY(f)          ((void)(f))

我能看到它的几种用途,但我想知道其他人是否经常在他们的代码库中使用它,以及是否有人看到了使用它的不良副作用。祝好。

5
我认为更好的问题是:“谁仍在使用MFC?” :p - tzaman
4
MFC是微软官方的*C++*封装Windows API的唯一工具。如果你要开发本地Windows图形用户界面应用程序,就需要使用MFC。(或Qt、wxWidgets、gtkmm等其他框架 :-))如果你已经有一个MFC应用程序,那么你就必须继续使用它。另外,我认为Visual Studio本身也是用MFC编写(或基于MFC)。 - Martin Ba
嗯,ATL/WTL现在已经被遗忘了吗? - Georg Fritzsche
1
@Georg...ATL并没有被遗忘 :-) 尽管它不涉及任何GUI相关的东西(据我所知),但我们主要使用MFC + CString来处理GUI。 - Martin Ba
1
WTL已经过时了,而且提供的功能远不如MFC UI类。WTL在2004年很有前途(我也花了很多时间在上面...),但现在用它来构建现代产品是不可行的。 - Roel
3个回答

3

在我以前做MFC编程时,我经常使用它。

基本上,所有返回值我通常懒得检查却会被Lint指出问题的函数,我都会用VERIFY进行包装。(例如::CloseHandle这样的调用)

在发布产品中使用它不会产生任何负面影响,因为在发布版本中它是一个无操作。


1
另一个问题是,如果我们在程序中有“懒得检查”的返回值。 ::CloseHandle 是一个很好的例子。 - Martin Ba

2

在我15年前的第一份编程工作中,我成功地加速了一个现有项目。他们的代码中有大量的ASSERT,但依赖于副作用。这意味着他们只能构建调试版本,而他们的程序在发布模式下将停止工作。我只需将所有的ASSERT替换为VERIFY


1
假设你有这样的代码:
  ...
  const int optional_return_value = AnyOldFunctionOrMethod(params);
  ASSERT(optional_return_value == 42);
}

这将在发布版本中产生警告C4189:'optional_return_value':本地变量已初始化但未引用

VERIFY宏可以避免此问题,可以通过在VERIFY宏中执行函数调用+检查(如威尔建议的那样)或仅在检查行中使用VERIFY而不是ASSERT来实现。


1
警告C4189在发布版本中可能不会弹出。 - Vaillancourt
@Alexandre - “might not” 的意思是什么? - Martin Ba
Martin - 在我的设置中,我必须使用级别4的警告报告并在调试模式下构建才能显示这些警告。它们在发布或级别3或更低版本中不会显示。也许有其他方法可以做到这一点,而且其他编译器可能具有不同的默认值。 - Vaillancourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接