错误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,我做到了。现在我陷入了这个错误。我不知道它可能是什么。可能是某种明显的东西

+0

我有这个问题,而我是包括来自同一个解决方案中的不同项目的头文件。新手错误,我知道,但我不经常用C++编写。 – 2011-06-06 23:37:16

你有一个圆形的包含问题。 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';'在标识符“通常为”之前,意味着您正试图声明变量的类型尚未定义。

+0

这很有道理。但是当我这样做的时候,它会捕获capplication.h中的错误,这个错误发生在我原来的错误之前。这不是我的代码。我实际上是想在http://www.two-kings.de/tutorials/dxgraphics/dxgraphics01.html上做一个教程。它的代码中也有一个循环包含。 – numerical25 2010-05-29 18:53:00

+0

这是不好的风格,是的,头部相互依赖,但他们每个都有包括警卫。如果包含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