【问题标题】:Include guard not working包括警卫不工作
【发布时间】:2011-07-25 02:10:29
【问题描述】:

我的 trackerFrame.h 文件中有以下内容。

它包含在 trackerFrame.cpp 和 main.cpp 中,无论出于何种原因,当我尝试编译与 wxWidgets 事件表宏有关的所有内容时,都会遇到多个定义问题。

#ifndef TRACKER_H
#define TRACKER_H

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#  include "wx/wx.h"
#endif


#include <wx/frame.h>
#include <wx/string.h>
#include <wx/menu.h>
#include <iostream>

class mainFrame : public wxFrame {
public:
    mainFrame(wxString title);
    DECLARE_EVENT_TABLE()
private:
    void closeProgram(wxCommandEvent & event);
};


BEGIN_EVENT_TABLE(mainFrame, wxFrame)
    EVT_MENU(wxID_EXIT, mainFrame::closeProgram)
END_EVENT_TABLE()

#endif

我 99.9% 确信我正确地执行了包含防护,但我就是不知道发生了什么。

【问题讨论】:

  • 包括每个编译单元的守卫工作,而不是每个程序。
  • 当您提到“多重定义问题”或任何编译器/链接器错误时,您应该将错误消息逐字复制并粘贴到您的问题中,以供将来参考。
  • 包含守卫不能防止程序范围内的多重定义问题。包含守卫从来没有打算用来保护程序范围内的多重定义问题。目前尚不清楚是什么让您得出结论认为您的包含警卫“不起作用”。他们工作得很好。他们只是做他们应该做的事(而不做他们不应该做的事)。

标签: c++ wxwidgets


【解决方案1】:

您的包含警卫是正确的。问题很可能在这里:

BEGIN_EVENT_TABLE(mainFrame, wxFrame)    
    EVT_MENU(wxID_EXIT, mainFrame::closeProgram)
END_EVENT_TABLE()

According to the wxWidgets wiki on event tables,需要将事件表定义到.cpp文件中。因此,您将拥有一个包含tracker.h 文件的tracker.cpp 文件,并将BEGIN_EVENT_TABLE(mainFrame, wxFrame) ... 映射放入tracker.cpp 文件中。

【讨论】:

  • 啊,谢谢你,我现在觉得自己太愚蠢了,我一定只是读到了那一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
相关资源
最近更新 更多