Именно поэтому проект может не скомпилироваться, если два заголовка включают друг друга?C++

Программы на C++. Форум разработчиков
Anonymous
Именно поэтому проект может не скомпилироваться, если два заголовка включают друг друга?

Сообщение Anonymous »

Я пытаюсь понять, почему два взаимно включенных заголовка (каждый заголовок включает другой) не работают так, как вы могли бы ожидать. Мне было интересно, верны ли мои рассуждения:
Если у вас есть FooHeader.h:

Код: Выделить всё

#pragma once
#include "BarHeader.h"

struct Foo { Bar bar;};
И BarHeader.h:

Код: Выделить всё

#pragma once
#include "FooHeader.h"
struct Bar { Foo foo; };
Причина, по которой это может не скомпилироваться, заключается в следующем:
Скажем, у вас есть main.cpp, который:

Код: Выделить всё

#include "BarHeader.h"

int main() { }
Теперь препроцессор выполняет свою работу, заменяет «BarHeader.h», чтобы он выглядел так:

Код: Выделить всё

|remove|
#include "BarHeader.h"

|add|
#include "FooHeader.h"
struct Bar { Foo foo; };

int main() {}
Хорошо, это шаг 1. Но препроцессору еще предстоит поработать, чтобы заменить "FooHeader.h", поэтому следующий шаг:

Код: Выделить всё

|remove|
#include "FooHeader.h"

|add|
#include "BarHeader.h"
struct Foo { Bar bar;}

struct Bar { Foo foo; }

int main() {}
Теперь файл выглядит так:

Код: Выделить всё

#include "BarHeader.h"

struct Foo { Bar bar;}

struct Bar { Foo foo; }

int main() {}
В нем все еще есть включение, НО, поскольку этот заголовочный файл уже включен, он не включает его снова, поэтому конечный результат:

Код: Выделить всё

struct Foo { Bar bar;}

struct Bar { Foo foo; }

int main() {}
Вот почему возникают проблемы с компиляцией, верно?
Разве это не было бы решено, если бы препроцессор просто переместил уже включенный заголовок в точку самого высокого/первого появления в файле? Что-то вроде: «Я вижу, что уже включил вас, но вы были включены сюда, поэтому я перенесу это сюда, и тогда все будет в порядке»? Это решило бы проблему, верно?

Подробнее здесь: https://stackoverflow.com/questions/791 ... each-other

Вернуться в «C++»