错误C2146:语法错误:缺少';'在标识符'g_App'之前

时间:2010-05-29 18:34:10

标签: c++ c visual-studio visual-studio-2008 visual-c++

我希望c ++,对他们提供的消息更具体一些。以下文档中引发了以下错误

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而我做了。现在我对这个错误很感兴趣。我不知道它可能是什么。可能是显而易见的事情

3 个答案:

答案 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