【问题标题】:error C2146: syntax error : missing ';' before identifier 'g_App'错误 C2146:语法错误:缺少“;”在标识符“g_App”之前
【发布时间】:2010-05-29 18:34:09
【问题描述】:

我希望 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,我做到了。现在我解决了这个错误。我不知道它可能是什么。可能是显而易见的事情

【问题讨论】:

  • 我遇到了这个问题,我在同一个解决方案中包含了来自不同项目的头文件。新手的错误,我知道,但我不经常用 C++ 编写。

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


【解决方案1】:

您遇到了循环包含问题。 main.h 包含 capplication.h,然后 capplication.h 包含 main.h。请记住,在 C++ 中,包含是对包含的标头内容的字面复制和粘贴。发生的情况是,当 main.h 包含 capplication.h 时,再次引入 main.h 的包含语句发生在 CApplication 类的声明之前,因此当第二次处理 main.h 时,@987654322 行@ 在 CApplication 类的声明之前到达。

capplication.h 包含 main.h 没有任何意义,因此您应该将 capplication.h 需要的任何内容从 main.h 移出到单独的头文件中,然后同时包含 main.h 和 capplication .h 包含该标题。

为了将来参考,消息“语法错误:缺少';'在标识符之前”通常表示您尝试将相关变量声明为尚未定义的类型。

【讨论】:

  • 这是有道理的。但是当我这样做时,它会在我遇到的原始错误之前捕获 capplication.h 中的错误。这不是我的代码。我实际上正在尝试在two-kings.de/tutorials/dxgraphics/dxgraphics01.html 做一个教程。它的代码中还有一个循环包含。
  • 这是一种糟糕的风格,是的,标题相互依赖,但它们每个都有包含警卫。如果包含main.h,则定义了main_h,包含capplication.h,定义了capplication_h,包含了main.h,但定义了main_h,因此PP返回到capplication.h,然后到main.h。在我看来,CApplication 类的定义将高于翻译单元中的extern CApplication g_App;
【解决方案2】:
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;

【讨论】:

    【解决方案3】:

    您的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多