Именно поэтому проект может не скомпилироваться, если два заголовка включают друг друга?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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