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

pet*_*hen 8 c++ mfc visual-c++-2008

对于静态Win32库,如何检测是否设置了任何"使用MFC"选项?

#ifdef ---BuildingForMFC---
....
#else
...
#endif
Run Code Online (Sandbox Code Playgroud)

Bru*_*kin 10

我一直在检查是否定义了符号_MFC_VER.

这是使用的MFC的版本号0x0700 = 7.0

它位于MSDN中的"预定义宏"中


Mou*_*uze 5

我在一个仅针对 Win32 控制台的原始项目中检查了 Visual Studio 2013,因此我必须再次添加 MFC 支持(不使用项目向导)。以下是我的发现:

  • 宏 _MFC_VER 在 afxver_.h 中定义,由 afx.h 包含。因此,如果您不直接/间接在 .cpp 文件中包含 afx.h,则不会定义 _MFC_VER 宏。例如,如果项目中包含不包含 afx.h 的源 .cpp,则该文件将在不定义 _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
Run Code Online (Sandbox Code Playgroud)

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