在VC編程過程中我們經常會遇到這樣的錯誤提示資訊error C2143: syntax error : missing ';' before '*',即在“*”號之前少了“;”。究竟是什麼原因?
背景:當在MainFrame類中包含CView.h檔案時會出現編譯錯誤。
下面我們首先看看編譯器的錯誤提示資訊:
--------------------Configuration: splitter - Win32 Debug--------------------
Compiling...
MainFrm.cpp
f:\c++pratice\vc\test\splitter\splitterview.h(21) : error C2143: syntax error : missing ';' before '*'
f:\c++pratice\vc\test\splitter\splitterview.h(21) : error C2501: 'CSplitterDoc' : missing storage-class or type specifiers
f:\c++pratice\vc\test\splitter\splitterview.h(21) : error C2501: 'GetDocument' : missing storage-class or type specifiers
Error executing cl.exe.
splitter.exe - 3 error(s), 0 warning(s)
我們可以在第一條錯誤提示上雙擊滑鼠左鍵,VC++將在代碼編輯視窗開啟CView類標頭檔,並定位到中游標所示位置。
這個錯誤在程式開發中會經常遇到,實際上,並不是錯誤資訊所說的那樣要在*號前加一個分號,而是程式不認識CSplitterDoc這個類。我們知道,C++程式在編譯時間,只有源檔案參與編譯,我們在CMainFrame類的源檔案前部加入了包含splitterView.h檔案的代碼#include "splitterView.h",因此,在編譯CMainFrame類得源檔案時,當遇到這行語句,就會展開splitterView.h檔案的內容,但該檔案中引用了尚未定義的splitterDoc.h類,因此編譯器就會報告上述錯誤資訊。那為什麼視類的源檔案包含它的標頭檔,在編譯時間沒有出錯呢?可以先看看splitterView類得源檔案,下面是她開始的幾行語句:
// splitterView.cpp : implementation of the CSplitterView class//#include "stdafx.h"#include "splitter.h"#include "splitterDoc.h"#include "splitterView.h"
可以看到,splitterView.cpp檔案在包含splitterView.h檔案之前包含了splitterDoc.h類檔案的內容,該檔案中是splitterDoc類得定義。然後才展開splitterView.h檔案,這是編譯器知道了splitterDoc類的定義。其實,為瞭解決上述錯誤,歸根到底就是要讓編譯器在引用splitterView類定義之前就知道了splitterDoc類的定義。因此,為瞭解決這裡出現的問題,可以把視類源檔案中包含文檔類的定義語句移到視類的標頭檔中,並放置在視類定義之前。即剪下splitterView.cpp中的“#include
"splitterDoc.h" ”,這行語句,並將其粘貼到splitterView.h檔案的前部。以下是修改後的splitterView.h檔案的前部代碼。
// splitterView.h : interface of the CSplitterView class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_SPLITTERVIEW_H__540E2E9D_94E3_4728_8C56_A95C12F3ACE2__INCLUDED_)#define AFX_SPLITTERVIEW_H__540E2E9D_94E3_4728_8C56_A95C12F3ACE2__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "splitterDoc.h"class CSplitterView : public CView{protected: // create from serialization onlyCSplitterView();DECLARE_DYNCREATE(CSplitterView)
再次編譯,OK!這時程式順利通過,問題解決了。