如何在预处理器中检测“使用MFC”

13

对于一个静态Win32库,我怎样才能检测出任何一个 "Use MFC" 选项是否已设置?

例如:

#ifdef ---BuildingForMFC---
....
#else
...
#endif
3个回答

14

我一直在检查是否定义了符号“_MFC_VER”。

它是正在使用的MFC版本号,0x0700 = 7.0。

它位于MSDN中的“预定义宏”中。


5
我检查了一个原始的针对Win32控制台的项目(在Visual Studio 2013中),所以我必须在第二次中添加MFC支持(而不使用项目向导)。以下是我的发现:
  • 宏_MFC_VER定义在afxver_.h中,并由afx.h包含。因此,如果您没有在.cpp文件中直接/间接包含afx.h,则不会定义_MFC_VER宏。例如,在项目中包含一个不包括afx.h的源.cpp文件,该文件将编译 WITHOUT _MFC_VER宏的定义。因此,它对于适应c ++代码(例如外部库)以检测MFC库的使用并选择性地支持MFC库是无用的。

  • 如果手动打开MFC的使用(选择解决方案资源管理器中的项目,然后右键单击,配置属性 ->常规 -> MFC使用),有两种可能性:

    • A)选择“在共享DLL中使用MFC”选项。这实际上会更新命令行参数,将_AFXDLL定义添加到预处理器宏列表中。
    • B)选择“在静态库中使用MFC”选项。这实际上删除了定义的_AFXDLL宏,但没有添加任何宏定义,因此无法确定是否实际使用了MFC。

因此,在我的测试活动期间,只有模式A可以有效地用于了解正在构建的项目中是否包括MFC库。

我维护一个支持多平台(Mac OSx,WinX控制台,WinX MFC,iOS,Unix,Android)的C ++跨平台库,并启用具有动态DLL的MFC是透明检测MFC存在的唯一方法。例如:

#if defined(_AFXDLL)
#    include <afx.h>
#endif

显然,您可以在项目预处理器列表中手动添加宏定义(_AFX)。

2

_AFX 符号通常用于 MFC 项目。


我也曾这样认为,但是当为一个 Win32 Library 项目启用“在动态库中使用MFC”选项(该项目创建时未选择'MFC支持'选项)时,此宏未被定义。 - peterchen
2
正如 @peterchen 所说,如果 MFC 作为动态库选项被激活,那么 _AFX 就不会被定义,而是使用 _AFXDLL。 - Mouze

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