我在VS2015 MFC项目中找到了以下代码。
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
我想了解这个预处理器的用途。谷歌没有给我任何足够的东西。如果你能对它有所了解,我将不胜感激。
答案 0 :(得分:6)
显然,类向导使用它将对话框ID(在您的情况下为IDD_DIALOG1
)映射到对话框类(从CDialoxEx派生)。
如果删除整个#ifdef AFX_DESIGN_TIME / #endif
部分,程序仍然可以正常编译,但类向导将不再正常工作。
在旧版本的Visual Studio中,对话框类的构造函数如下所示:
CSomeDlg::CSomeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSomeDlg::IDD, pParent)
因此在编译期间实际使用了CSomeDlg::IDD
符号,并且没有#ifdef AFX_DESIGN_TIME
。
在Visual Studio的最新版本中(至少使用VS2017),对话框类的构造函数如下所示:
CSomeDlg::CSomeDlg(CWnd* pParent /*=NULL*/)
: CDialog(IDD_DIALOG1, pParent)
因此CSomeDlg::IDD
在编译期间不再有用,因此Microsoft决定有条件地编译它。但这不是绝对必要的,您可以完全删除#ifdef AFX_DESIGN_TIME
和相应的#endif
,代码仍然可以编译,类向导仍然可以正常工作。
BTW,尝试用enum { IDD = IDD_DIALOG1 };
替换enum { IDD = IDD_DIALOG123 };
并调用类向导,您将收到以下错误消息: