как избежать соединения заголовка - PullRequest
1 голос
/ 16 июня 2010

Я пытаюсь решить эту проблему, потому что я не могу найти хороший ресурс в Интернете, который делает это.

Я не до конца понимаю проблему, потому что мне так и не удалось ее решить, поэтому я попытаюсь описатьэто как можно лучше.

Некоторое время назад у меня возникла проблема, когда заголовки игнорировались, потому что «они были вызваны уже один раз, и поэтому, когда они вызывались снова из другого документа, это игнорировалось, и поэтому была ошибкабудучи брошенным "

Я никогда полностью не понимал этого, потому что вы можете вызывать заголовок более одного раза без ошибок

header1.h

#ifndef _FCLASS_
#define _FCLASS_
class firstClass {
     ...//declaration
}

#endif

header2.h

#ifndef _SCLASS_
#define _SCLASS_

#include "header1.h"

class SecondClass:firstClass{
     ...//declaration
}

#endif

header3.h

#ifndef _TCLASS_
#define _TCLASS_

#include "header1.h"
class thirdClass:firstClass{
     ...//declaration
}
#endif

В приведенном выше примере класс header1 вызывался дважды, и не должно возникать никаких ошибок.Хотя header1 был объявлен один раз, он может использоваться несколькими заголовками.

Поэтому мой вопрос в том, в каких случаях заголовок может фактически игнорироваться документом, если он уже был объявлен один раз.

Относится ли этот тип проблемы только к файлам .cpp, которые содержат заголовки ??

Ответы [ 2 ]

5 голосов
/ 16 июня 2010

Чаще всего это происходит, когда есть цикл заголовка (два заголовка, включая друг друга, являются наиболее вероятным случаем).

Просто для иллюстрации, реальные примеры обычно более сложны.

Ах:

#ifndef A_INCLUDED
#define A_INCLUDED

#include "B.h"

class A
{
};

class C
{
    B b;
}
#endif

Bh:

#ifndef B_INCLUDED
#define B_INCLUDED

#include "A.h"

class B : public A
{
};
#endif

В этом случае, независимо от того, какой заголовок вы включаете, существует циклическая зависимость, которая препятствует его компиляции.Если вы включаете Ah, он включает BhBh, затем включает Ah, но защита включения предотвращает его повторное включение.Затем он продолжает компилировать Bh и завершается ошибкой, когда не знает о class A.Обратная ситуация применяется, если сначала включить Bh.

РЕДАКТИРОВАТЬ: я должен был упомянуть, что это, как правило, решается путем рефакторинга логики из одного или обоих заголовков в другой заголовок и / или использования предварительных объявлений вместо реальных включений.

2 голосов
/ 16 июня 2010

Я могу вспомнить один сценарий. Если header1.h имеет разделы, которые исключаются условной компиляцией, и эти условия изменяются объявлениями в последующих включенных заголовочных файлах Последующие включения в header1.h будут пропущены включенной защитой и не смогут объявить условные разделы, которые могут привести к ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...