1. 程式人生 > >MFC之標頭檔案相互包含問題及解決方法 error C4430: 缺少型別說明符

MFC之標頭檔案相互包含問題及解決方法 error C4430: 缺少型別說明符

問題一:

error C4430: 缺少型別說明符 - 假定為 int。注意: C++ 不支援預設 int

原因分析:

1. (此情況經常出現在大型工程專案中)如果存在兩個類的標頭檔案a.h和b.h,在a.h中有這樣的語句:#include "b.h",在b.h檔案中有這樣的語句:#include "a.h"且在一個類中有另一個類的物件時,那麼就會出現這樣的錯誤。

2. 沒有包含要定義的類的標頭檔案。

3.專案中少加了巨集定義,導致標頭檔案重複定義或相應巨集無法識別。

4.當有多個頭檔案時,順序寫反也可能導致相關的錯誤,其根本是標頭檔案中的預編譯語句被隱去了。

5. 可能是函式沒有寫返回值

解決方法:

我遇到的問題系第一種情況,即標頭檔案的相互包含問題,經過多次嘗試,最後發現在一個類中使用另外一個類時,應該在前面應該宣告另外那個需要引用的類,即例如:

class CDIProView;

// CSlideThreshod2 對話方塊

class CSlideThreshod2 : public CDialog

{

       CDIProView * m_pView;

......

}

問題二:

應該不能稱之為問題,就是自定義訊息,感覺還是挺有用的,最近在非模態對話方塊中使用到自定義訊息~~~ 自定義訊息步驟:

第一步:使用者自定義訊息巨集

#define WM_MY_MESSAGE (WM_USER + n)

第二步:實現訊息處理函式,該函式使用WPRAM和LPARAM引數並返回LPESULT

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
  {
     // TODO: 處理使用者自定義訊息
     ...
    return 0;
  }

第三步:在類標頭檔案的AFX_MSG塊中說明訊息處理函式

class CMainFrame:public CMDIFrameWnd
   {
     ...
     // 一般訊息對映函式
     protected:
     // {{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
   }

第四步:在使用者類的訊息塊中,使用ON_MESSAGE巨集指令將訊息對映到訊息處理函式中

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
   //{{AFX_MSG_MAP(CMainFrame)
   ON_WM_CREATE()
   ON_WM_TIMER()
   ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
   //}}AFX_MSG_MAP
   END_MESSAGE_MAP()