ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором "g_App" - PullRequest
1 голос
/ 29 мая 2010

Я хотел бы, чтобы 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 ]

4 голосов
/ 29 мая 2010

У вас есть проблема кругового включения.main.h включает в себя capplication.h, а затем capplication.h включает в себя main.h.Помните, что в C ++ включение - это буквальное копирование и вставка содержимого включенного заголовка.Происходит следующее: когда main.h включает capplication.h, оператор include, который снова возвращает main.h, происходит до делкарации класса CApplication, и поэтому, когда main.h обрабатывается второй раз, строка extern CApplication g_App достигается до объявления класса CApplication.

Нет никакого смысла в том, чтобы capplication.h включал main.h, поэтому вы должны удалить из main все, что нужно capplication.h.h в отдельный заголовок, а затем включите этот заголовок в main.h и capplication.h.

Для дальнейшего использования появится сообщение «синтаксическая ошибка: отсутствует»;перед идентификатором " обычно означает, что тип, который вы пытаетесь объявить в рассматриваемой переменной, так как не был определен.

3 голосов
/ 29 мая 2010
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;
0 голосов
/ 29 мая 2010

Ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...