Forward declaration c что это

СОДЕРЖАНИЕ

Примеры

Базовый пример на C:

В Паскале и других языках программирования Wirth существует общее правило, что все сущности должны быть объявлены перед использованием, и, таким образом, предварительное объявление необходимо, например, для взаимной рекурсии. В C применяется то же общее правило, но за исключением необъявленных функций и неполных типов. Таким образом, в C можно (хотя и неразумно) реализовать пару взаимно рекурсивных функций следующим образом:

Классы

В C ++ классы и структуры могут быть объявлены вперед следующим образом:

В C ++ классы могут быть объявлены вперед, если вам нужно использовать только тип указателя на этот класс (поскольку все указатели объектов имеют одинаковый размер, и это то, что заботит компилятор). Это особенно полезно внутри определений классов, например, если класс содержит член, который является указателем (или ссылкой) на другой класс.

Форвард-объявление используется, чтобы избежать ненужного связывания, что помогает сократить время компиляции за счет уменьшения количества включений заголовков. У этого есть тройное преимущество:

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

В Objective-C классы и протоколы могут быть объявлены вперед следующим образом:

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

Прямая ссылка

Пример (действительной) прямой ссылки в C ++ :

Источник

Forward declaration c что это

В теории программирования термин forward declaration означает декларирование идентификатора (обозначающего такой объект, как тип, переменная или функция) до того, как программист дал ему полное определение. Это требуется для того, чтобы компилятор знал тип идентификатора (чтобы можно было определить необходимый размер памяти для создания объекта, для проверки типа или подписи функции), при этом необязательно идентификатор может содержать значение (в случае переменной). Это также полезно для однопроходных компиляторов. Forward declaration используется в языках, которые требуют декларирования объекта перед его использованием (языки C, C++); это необходимо в таких языках для взаимной рекурсии (mutual recursion), поскольку невозможно определить эти функции без ссылки вперед в одном определении. Это также полезно для того, чтобы наглядно организовать структуру кода, например если Вы хотите разместить основную, главную часть кода в верхней части модуля, и ниже все вызываемые из этой главной части функции.

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

Давайте рассмотрим базовый пример предварительного декларирования функции на языке C:

В Pascal и других Виртовских языках программирования, главное правило гласит: все сущности должны быть декларированы перед использованием, так что нужно использовать forward declaration, что необходимо, например, для взаимной рекурсии (mutual recursion). На языке C это главное правило тоже работает, но здесь есть исключение для неопределенных функций и незавершенных типов. Таким образом, на C можно (хотя и нежелательно) реализовать пару взаимно рекурсивных функций:

В Pascal та же самая реализация требует forward declaration для второй функции, чтобы она могла использоваться в первой. Без наличия такой forward declaration компилятор выдаст ошибку, сообщающую о том, что второй идентификатор используется до того, как он был определен.

[Классы]

На языке C++ классы и структуры могут быть forward-declared примерно так:

На языке C++ классы могут быть forward-declared, если только Вам нужно использовать тип указателя на этот класс (поскольку все указатели на объекты имеют одинаковый размер, и об этом должен позаботиться компилятор). Особенно это полезно внутри определений класса, например если класс содержит в себе член, который является указываетeлем на другой класс; чтобы избежать цикличных ссылок (например, этот класс может также содержать член, который указывает на этот же класс), мы просто вместо этого делаем предварительное декларирование классов.

Forward declaration для класса недостаточно, если Вам нужно использовать действительный тип класса. Например, если Вы имеете член класса, который имеет тип не указателя, а напрямую задает класс, или если Вы используете его как базовый класс, или если Вам нужно использовать методы этого класса в другом методе.

На языке Objective-C классы и протоколы могут быть forward-declared примерно так:

Применять forward declaration для класса или протокола недостаточно, если Вам нужен подкласс subclass этого класса, или если надо реализовать этот протокол.

[Ссылка вперед (forward reference)]

Термин forward reference иногда используется как синоним forward declaration. Однако чаще это относится к реальному использованию объекта перед его определением; то есть первая ссылка над второй в коде перед объектом является forward reference. Так что можно сказать, что поскольку в Pascal обязательно нужно применить forward declaration, то forward reference в Pascal запрещены.

Пример (допустимой) forward reference на языке C++:

В этом примере есть две ссылки на myValue до того, как эта переменная была определена. C++ главным образом запрещает применять forward reference, но это разрешено в специальном случае для членов класса. Поскольку функция член класса accessor не может быть скомпилирована, пока компилятор не узнает тип члена класса переменной myValue, то это обязанность компилятора помнить определение accessor, пока он не увидит декларацию myValue.

Разрешение использования forward reference может значительно усложнить компиляцию и увеличить требования к памяти со стороны компилятора, и это обычно не дает реализовать компилирование за один проход.

Источник

[c++] forward declaration для подструктуры.

P.S. никому не кажется лишним правило о строгом порядке объявления?

[c++] forward declaration для подструктуры.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

> никому не кажется лишним правило о строгом порядке объявления?

Переходи на нормальные языки.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

> P.S. никому не кажется лишним правило о строгом порядке объявления?

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

> Переходи на нормальные языки

на DCC? я там документации нашел 3 странички, а хаскель нормальным не считаю

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

[c++] forward declaration для подструктуры.

Убого же. Лучше вынести подструктуры во вне и typedef-ить всё подряд.

[c++] forward declaration для подструктуры.

Я-то перешёл, а вот моя конторка не может себе позволить нанять цепепе-специалиста, студенты кругом. Какая уж тут речь о более других языках. Использование мною лиспа-то карается косыми взглядами, суки тупые.

[c++] forward declaration для подструктуры.

я вижу у вас здоровые отношения в коллективе

[c++] forward declaration для подструктуры.

угу, троллинг наяву. %(

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

даже на чистом C желательно обьявлять, как

typedef struct mystruct <
.
> mystruct ;

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

> а хаскель нормальным не считаю

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

>Убого же. Лучше вынести подструктуры во вне и typedef-ить всё подряд.

так в чем проблема вынести B::C наружу и не городить всякий говнокод?

[c++] forward declaration для подструктуры.

>> P.S. никому не кажется лишним правило о строгом порядке объявления?

[c++] forward declaration для подструктуры.

[c++] forward declaration для подструктуры.

вложенная запись читабельности не добавляет, а создание неймспейса дает такую же структурированность

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

это ты типа тонко тролльнул, да?

[c++] forward declaration для подструктуры.

> вложенная запись читабельности не добавляет, а создание неймспейса дает такую же структурированность

Типа ты предлагаешь заменить родительскую структуру на якобы эквивалентный ей неймспейс?

[c++] forward declaration для подструктуры.

Это я послал луч дружбы.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

>Это я послал луч дружбы.

Посылаю в ответку. Добро и любовь.

Так все-таки, что мешает вынести B::C в отдельный неймспейс?

[c++] forward declaration для подструктуры.

> Типа ты предлагаешь заменить родительскую структуру на якобы эквивалентный ей неймспейс?

[code]
struct B <
struct C <
[/code]

практически не встречаются

[c++] forward declaration для подструктуры.

И каков смысл такого действия в цепепе-коде?

[c++] forward declaration для подструктуры.

>>Это я послал луч дружбы.
>Посылаю в ответку. Добро и любовь.

>Так все-таки, что мешает вынести B::C в отдельный неймспейс?

Уже можно создать экземпляр неймспейса? лол

[c++] forward declaration для подструктуры.

Вы, лесторы, два брата-акробата и фанатики кривого стандарта?
Почему, всё то что нельзя сделать в рамках ебанутого стандарта признаётся как невменяемым?
Не встречается такое(?) видимо по причине недостаточной гибкости цепепе.

[c++] forward declaration для подструктуры.

теперь понятно за что тебя не любят коллеги

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

>Уже можно создать экземпляр неймспейса? лол

. скажите мне, что это тролль

[c++] forward declaration для подструктуры.

[c++] forward declaration для подструктуры.

> Не встречается такое(?) видимо по причине недостаточной гибкости цепепе.

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

П.С. предлагаю спокойно продолжать обсуждение без взаимных оскорблений

[c++] forward declaration для подструктуры.

у вас слишком резкая манера общения, в данном случае не стандарты причина неиспользования описания вложенных структур

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

>Не встречается такое(?) видимо по причине недостаточной гибкости цепепе.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

Но вообще такие перекрестные зависимости говорят о плохо продуманном интерфесе структур/классов или вообще всей программы.

P.S. не нравятся правила С++, используйте другой язык. Ибо он такой, какой он есть. Или сделайте свой с+++. Или пишите письма в комитет стандартизации языка. При текущем обосновании у вас, правда, нет шансов.

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

[c++] forward declaration для подструктуры.

В первом варианте определение Data всегда перед глазами. Второй вариант чем читабельнее?

[c++] forward declaration для подструктуры.

В первом варианте определение Data всегда перед глазами

именно, что мешает рассматривать собс-но Object1 и Object2

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

[c++] forward declaration для подструктуры.

во вменяемых проектах конструкции вроде

Источник

How do I forward declare an inner class? [duplicate]

I have a class like so.

Elsewhere, I want to pass a Container::Iterator by reference, but I don’t want to include the header file. If I try to forward declare the class, I get compile errors.

Compiling the above code gives.

How can I forward declare this class so I don’t have to include the header file that declares the Iterator class?

3 Answers 3

This is simply not possible. You cannot forward declare a nested structure outside the container. You can only forward declare it within the container.

You’ll need to do one of the following

I don’t believe forward declaring inner class of on an incomplete class works (because without the class definition, there is no way of knowing if there actually is an inner class). So you’ll have to include the definition of Container, with a forward declared inner class:

Then in a separate header, implement Container::Iterator:

Then #include only the container header (or not worry about forward declaring and just include both)

I know of no way to do exactly what you want, but here is a workaround, if you are willing to use templates:

Hopefully, this idiom might be of some use to you (and hopefully your compiler is EDG-based and implements export 😉 ).

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

Not the answer you’re looking for? Browse other questions tagged c++ forward-declaration or ask your own question.

Linked

Related

Hot Network Questions

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.3.40888

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

forward declaration of a struct in C?

I am missing something here. Please help me fix this. Thanks.

3 Answers 3

A struct (without a typedef) often needs to (or should) be with the keyword struct when used.

If you typedef your struct you can leave out the struct keyword.

Note that it is legal to reuse the struct name

Try changing the forward declaration to this in your code:

It might be more readable to do add a suffix to indicate struct name and type name:

Forward declaration c что это. Смотреть фото Forward declaration c что это. Смотреть картинку Forward declaration c что это. Картинка про Forward declaration c что это. Фото Forward declaration c что это

The whole point is if that type isn’t completed before you use it to declare something that is actually a tentative definition and not a declaration (so struct e f at file / block scope without extern ) that isn’t a pointer, or if you attempt to dereference the pointer if it is a pointer, then you will get an incomplete type error.

It doesn’t let you use a type with incomplete size as a struct member either (if the size is unknown up to an including this like of code), even if the struct is never used to declare / define a variable. I think this is because the struct is a type, and when you provide the complete definition of a type, which you can only do once, it has to be of a complete size, not incomplete (having a member of unknown size), so the type would be unusable. This struct containing the incomplete struct never be referenced, whereas you can reference an incomplete type with incomplete size as opposed to a complete type with incomplete size (as long as you don’t define anything with it), and you can reference, but not deference, (an address can be stored in) a pointer with incomplete type, because it has complete size. You can reference memory so long as its incomplete type doesn’t entail an incomplete size. extern struct i j at file / block scope is allowed because it will never be needed unless j is referenced in the code, by which time the type must be complete.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *