【问题标题】:C++ macro declared in a class definition?在类定义中声明的 C++ 宏?
【发布时间】:2013-10-22 20:46:07
【问题描述】:

过去几天我一直在学习 C++,但我刚刚发现了一些我在书本上没有看到的东西,也没有在 Google 上做过一些研究。

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

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

谁能解释一下这种宏是什么?它叫什么(所以我可以进一步研究它),它是什么意思?

【问题讨论】:

  • 宏没有作用域,甚至不知道编程语言。它们在编译器正确看到您的代码之前被处理。
  • 宏是在别处定义的,是微软特有的东西,没什么特别的

标签: c++ macros


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可能会觉得this很有趣:-

    如果您决定清理并重新安排您的代码,最好小心 关于将出现在 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多