我希望c ++,对他们提供的消息更具体一些。以下文档中引发了以下错误
#ifndef main_h
#define main_h
//includes
#include <windows.h>
#include <commctrl.h>
#include <d3d9.h>
#include <fstream>
#include "capplication.h"
//constants
#define TITLE "D3D Tut 01: Create Window"
#define WINDOW_X 350
#define WINDOW_Y 320
//Button ID's
#define ID_START 1
#define ID_CANCEL 2
//globals
extern CApplication g_App;
//function prototypes
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
#endif
唯一可能抛出此错误的头文件是capplication.h。如下所示
#ifndef capplication_h
#define capplication_h
#include"main.h"
class CApplication
{
public:
CApplication(void);
~CApplication(void);
void InitWindow(void);
void SaveSettings(void);
void LoadSettings(void);
void KillWindow(void);
inline bool GetWindowStatus(void)
{
return m_bRunningWindow;
}
inline HWND GetWindowHandle(void)
{
return m_hWindow;
}
inline void SetWindowStatus(bool bRunningWindow)
{
m_bRunningWindow = bRunningWindow;
}
private:
bool m_bRunningWindow;
HWND m_hWindow,
m_hBtnStart,
m_hBtnCancel,
m_hLblResolution,
m_hCbResolution,
m_hLblBackBuffer,
m_hCbBackBuffer,
m_hLblDepthStencil,
m_hCbDepthStencil,
m_hLblVertexProcessing,
m_hCbVertexProcessing,
m_hLblMultiSampling,
m_hCbMultiSampling,
m_hLblAnisotropy,
m_hCbAnisotropy;
DWORD m_dwWidth,
m_dwHeight,
m_dwVertexProcessing,
m_dwAnisotropy;
D3DFORMAT m_ColorFormat,
m_DepthStencilFormat;
D3DMULTISAMPLE_TYPE m_MultiSampling;
};
#endif
除此之外,我看到的唯一可疑的东西是第一个代码中给出的fstream。我确实有它 fstream.h
但是VC ++并没有认识到它,所以我被告知要删除h而我做了。现在我对这个错误很感兴趣。我不知道它可能是什么。可能是显而易见的事情
答案 0 :(得分:4)
您有循环包含问题。 main.h包含capplication.h,然后capplication.h包含main.h.请记住,在C ++中,包含是对包含的标头内容的文字复制和粘贴。发生的事情是当main.h包含capplication.h时,带来main.h的include语句再次发生在CApplication类的退出之前,因此当main.h第二次处理时,行{{在声明CApplication类之前已达到1}}。
对于capplication.h来说,将main.h包含在内是没有意义的,所以你应该将capplication.h需要的东西从main.h移到一个单独的头文件中,然后同时使用main.h和capplication .h包括那个标题。
供将来参考,消息“语法错误:缺少';'标识符“通常之前表示您尝试声明有问题的变量的类型尚未定义。
答案 1 :(得分:3)
extern CApplication g_App; // missing ‘;’ before identifier ‘g_App’
这条线路可能出现什么问题?错误消息本身并不是特别不言自明,但只有一点点经验,很明显,可能的罪魁祸首是它不知道此时CApplication
是什么。
怎么会发生这种情况?我希望Visual Studio有一个显示预处理器输出的选项,但你也可以在脑中做到这一点。如果.cpp
源文件包含 main.h ,那么包含哪些文本? ( main.h 的文本,其中包含 capplication.h 的文本。)如果源文件包含 capplication.h ,那么文字包括在内? ( capplication.h 顶部的空白行,然后是 main.h 的文本,然后是 capplication.h 的其余部分CApplication
的定义。出了什么问题?)
main.h 是否真的需要#include capplication.h 或者该类的声明是否足以声明g_App
?
// in main.h
class CApplication;
extern CApplication g_App;
答案 2 :(得分:0)
您的main.h
无需加入capplication.h
即可声明extern CApplication g_App
。你可以尝试:
#ifndef main_h
#define main_h
//includes
#include <windows.h>
#include <commctrl.h>
#include <d3d9.h>
#include <fstream>
//constants
#define TITLE "D3D Tut 01: Create Window"
#define WINDOW_X 350
#define WINDOW_Y 320
//Button ID's
#define ID_START 1
#define ID_CANCEL 2
//globals
class CApplication;
extern CApplication g_App;
//function prototypes
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
#endif