1

在过去的几天里,我一直在学习 C++,但我只是遇到了一些我在书中没有看到的东西,也没有在谷歌上做过一些研究。

据我所知,宏是一个语句或“变量”名称,前面带有#define帽子,允许稍后指定某些值或函数并自动插入所需的位置。

但是,我遇到了一个在 clas 中声明的函数,它前面没有#define,它被称为“宏”。该函数来自 MFC 并被调用DECLARE_MESSAGE_MAPhttp://msdn.microsoft.com/en-us/library/08ea0k43.aspx

有人可以解释这种类型的宏是什么吗?它叫什么(所以我可以进一步研究它),它是什么意思?

4

2 回答 2

2

DECLARE_MESSAGE_MAP 只是一个在 MFC (Afx.h?) 包含集合中定义的#define。与任何其他#define 相比,没有什么特别之处。

这是一本旧书:MFC Internals,但如果您想了解 MFC 中的所有这些东西实际上做了什么以及它们是如何工作的,那么它是一本经典之作。

于 2013-10-22T20:48:45.843 回答
0

你可能会觉得很有趣:-

如果您决定清理和重新安排您的代码,最好小心将出现在 MFC 派生类头文件中的 DECLARE_MESSAGE_MAP() 宏。这个宏包含一个“受保护的”存储类声明。因此,除非在此之后指定了任何其他存储类,否则该宏下的所有内容都将受到保护。编译期间发生的正常错误将是无法访问私有变量。但是你不能轻易弄清楚出了什么问题,你只能看到上面的一个宏调用和一个公共存储类。

#ifdef _AFXDLL
#define DECLARE_MESSAGE_MAP() \
private: \
    static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
    static AFX_DATA const AFX_MSGMAP messageMap; \
    static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); \
    virtual const AFX_MSGMAP* GetMessageMap() const; \

#else
#define DECLARE_MESSAGE_MAP() \
private: \
    static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
    static AFX_DATA const AFX_MSGMAP messageMap; \
    virtual const AFX_MSGMAP* GetMessageMap() const; \

#endif

解决方案是将其留在受保护的存储类中。即,在其上方声明一个受保护的存储类,并在其下方声明需要保护的函数和变量。让公共函数和变量位于受保护部分之上,并正确声明存储类。

于 2013-10-22T20:49:54.900 回答