错误C2146:语法错误:缺少';'在标识符'g_App'之前
我希望C++对它们提供的消息有一些更具体的了解。以下错误被抛出的文件在下面错误C2146:语法错误:缺少';'在标识符'g_App'之前
main.h
#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。下面
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,我做到了。现在我陷入了这个错误。我不知道它可能是什么。可能是某种明显的东西
你有一个圆形的包含问题。 main.h包含capplication.h,然后capplication.h包含main.h。请记住,在C++中,包含是包含标题内容的文字复制和粘贴。发生什么事情是,当main.h包含capplication.h时,再次引入main.h的include语句发生在CApplication类的解除之前,因此当第二次处理main.h时,行extern CApplication g_App
为在CApplication类的声明之前达到。
对于包含main.h的capplication.h没有任何意义,所以您应该将main.h所需的所有capplication.h移动到单独的头文件中,然后将main.h和main.h capplication.h包含该头文件。
为了将来的参考,消息“syntax error:missing';'在标识符“通常为”之前,意味着您正试图声明变量的类型尚未定义。
这很有道理。但是当我这样做的时候,它会捕获capplication.h中的错误,这个错误发生在我原来的错误之前。这不是我的代码。我实际上是想在http://www.two-kings.de/tutorials/dxgraphics/dxgraphics01.html上做一个教程。它的代码中也有一个循环包含。 – numerical25 2010-05-29 18:53:00
这是不好的风格,是的,头部相互依赖,但他们每个都有包括警卫。如果包含main.h,则定义main_h,包含capplication.h,定义capplication_h,包含main.h,但定义main_h则PP返回'capplication.h',然后到'main.h'。在我看来,类'CApplication'的定义会在翻译单元中的'extern CApplication g_App;'之上。 – 2010-05-29 19:00:42
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;
您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
我有这个问题,而我是包括来自同一个解决方案中的不同项目的头文件。新手错误,我知道,但我不经常用C++编写。 – 2011-06-06 23:37:16