我有非常简单的以下代码:

main.cpp

#include "ui_library_browser.h"
#include <QtGui/QApplication>
#include "StartWindow.h"
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  StartWindow w;
  w.show();
  return a.exec();
}

StartWindow.h
#ifndef STARTWINDOW_H_
#define STARTWINDOW_H_

#include <qwidget>
#include "MainWindow.h"

class StartWindow : public QWidget
{
  Q_OBJECT

public:
  StartWindow();
  ~StartWindow();
  MainWindow main_window;  //<-- Problem
};
#endif

MainWindow.h
#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_

#include <qdialog.h>
#include "StartWindow.h"

class MainWindow : public QDialog
{
  Q_OBJECT

public:
  MainWindow();
  ~MainWindow();
};
#endif

由于在MainWindow.h header 中包含#include“StartWindow.h”,因此会产生错误。但是,我认为使用#ifndef和#define可以阻止此类问题?有人可以帮我清理一下吗?

最佳答案

所谓的“头保护器”用于防止某种不同的错误:通过一个编译单元中的不同间接包含多次包含相同的头。例如,
您可以包含来自main.cpp的“a.h”,然后包含来自main.cpp的“b.h”,其中包含“a.h”本身。

在您的情况下,两个 header 试图在圆周上互相包含,这是不可能的-C / C++预处理器作为简单的文本“复制粘贴”工作,这种情况将发明无限的文本插入递归。

而且我真的不明白为什么您需要在“MainWindow.h” header 中包含“StartWindow.h”。

10-05 22:59