Здравствуйте
Пишу следующий код в h-файл (извините, что такой длинный):
#ifndef mainwndincluded
#define mainwndincluded
#include <wx/wx.h>
#define Order 4
enum {
ID_BTNSOLVE = 1,
ID_BTNQUIT,
};
class MainWnd: public wxFrame {
public:
MainWnd(const wxString &title);
void OnSolve(wxCommandEvent &ev);
void OnQuit(wxCommandEvent &ev);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(MainWnd, wxFrame)
EVT_BUTTON(ID_BTNSOLVE, MainWnd::OnSolve)
EVT_BUTTON(ID_BTNQUIT, MainWnd::OnQuit)
END_EVENT_TABLE()
#endif
И получаю ошибки линковки
error LNK2005: "protected: static struct wxEventTable const MainWnd::sm_eventTable" (?sm_eventTable@MainWnd@@1UwxEventTable@@B) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: static class wxEventHashTable MainWnd::sm_eventHashTable" (?sm_eventHashTable@MainWnd@@1VwxEventHashTable@@A) already defined in main.obj
1>MainWnd.obj : error LNK2005: "private: static struct wxEventTableEntry const * const MainWnd::sm_eventTableEntries" (?sm_eventTableEntries@MainWnd@@0QBUwxEventTableEntry@@B) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: virtual class wxEventHashTable & __thiscall MainWnd::GetEventHashTable(void)const " (?GetEventHashTable@MainWnd@@MBEAAVwxEventHashTable@@XZ) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: virtual struct wxEventTable const * __thiscall MainWnd::GetEventTable(void)const " (?GetEventTable@MainWnd@@MBEPBUwxEventTable@@XZ) already defined in main.obj
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Documents\Visual Studio 2008\Projects\E\Release\1SL.exe : fatal error LNK1169: one or more multiply defined symbols found
Я же определил #ifndef ... #endif, значит этот h-файл должен включаться только один раз (он включен в main.cpp и mainwnd.cpp, где описана реализация методов). Тогда почему мне говорят о нескольких определениях одного и того же символа?
Спасибо
А вот если перенести эту секцию
BEGIN_EVENT_TABLE(MainWnd, wxFrame)
EVT_BUTTON(ID_BTNSOLVE, MainWnd::OnSolve)
EVT_BUTTON(ID_BTNQUIT, MainWnd::OnQuit)
END_EVENT_TABLE()
в срр-файл, все работает. Ничего не понимаю. Да какая ему разница, если inc-файл включается только один раз?