1

ここ数日、C++ の学習に費やしてきましたが、書籍や Google で調べた結果、見たことのないものに出くわしました。

私の知る限り、マクロはステートメントまたは「変数」名であり、#defineハットが前に付いているため、特定の値または関数を後で指定して、必要な場所に自動的に挿入できます。

#defineただし、クラス内で宣言され、前になく、「マクロ」と呼ばれる関数に出くわしました。この関数は MFC からのもので、 と呼ばれDECLARE_MESSAGE_MAPます。 http://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() マクロに注意してください。このマクロには、「保護された」ストレージ クラス宣言が含まれています。したがって、このマクロの下にあるものはすべて、その後に指定された他のストレージ クラスがない限り保護されます。コンパイル時に発生する通常のエラーは、private 変数にアクセスできません。しかし、上のマクロ呼び出しとパブリック ストレージ クラスしか確認できないため、何が問題なのかを簡単に特定することはできません。

#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 に答える