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()