Форвардное объявление C / C ++ против включения - PullRequest
1 голос
/ 22 октября 2011

Что происходит, когда вы включаете какой-то файл, и что происходит, когда вы отправляете объявление какой-либо функции / класса?Если два файла содержат один и тот же файл, первый из них успешно прочитает все функции, второй не получится, но все равно сможет использовать функции ??

Что произойдет, когда я перешлю объявление какой-либо функции?Эта функция теперь "сохранена", и я могу использовать ее где угодно или она известна только для одного и того же файла?тогда почему два файла с include (в файл с гвардией) будут работать?

Могу ли я просто включить каждую вещь в основной и больше не беспокоить?

РЕДАКТИРОВАТЬ:

А почему в файлах cpp должны быть свои заголовки ??Что если я их не включу?

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

Что происходит, когда вы включаете какой-то файл, и что происходит, когда вы объявляете некую функцию / класс?

Когда вы включаете файл, его содержимое становится «копированным и вставленным»в источник включения препроцессором.Когда вы пересылаете объявление функции / класса, вы объявляете неполный тип, давая понять остальной части модуля перевода, что функция / класс с таким именем существует, и сделаете его пригодным для использования в контексте, где разрешено неполное объявление.

Если два файла содержат один и тот же файл, первый из них успешно прочитает все функции, второй не получится, но все равно сможет использовать функции ??

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

Что произойдет, когда я перешлю объявление какой-либо функции?Эта функция теперь "сохранена", и я могу использовать ее где угодно или она известна только для одного и того же файла?тогда почему два файла с include (в файл с защитой) будут работать?

Эта функция может использоваться только в модуле перевода, который содержит предварительное объявление.Как правило, каждый исходный файл (.cpp) представляет собой отдельную единицу перевода, в пределах этой единицы перевода допустимы определения макросов (определения заголовков), а также объявления / определения.Защита заголовка предотвращает включение одного и того же заголовочного файла более одного раза в один и тот же модуль перевода, чтобы предотвратить многочисленные ошибки объявления.

0 голосов
/ 22 октября 2011

Что происходит, когда вы включаете какой-то файл и что происходит когда вы вперед объявите какую-то функцию / класс?

Когда вы include файл, препроцессор эффективно копирует вставляет весь файл included в файл, делая include ING. Когда вы пересылаете объявление функции / класса, вы сообщаете компилятору, что она существует, но вам не нужен весь заголовочный файл. требуется , если у вас круговая зависимость, и значительно сокращает время компиляции в других местах.

Если два файла содержат один и тот же файл, первый прочитает успешно все функции второго не удастся, но все еще сможет использовать функции ??

Если один и тот же файл будет включен дважды в одну единицу перевода (.cpp файл), то оба будут «успешными», но если заголовок содержит защитные элементы любого типа, во второй раз ничего не будет загружено, потому что Препроцессор уже «скопировал» его в модуль перевода, и сделать это во второй раз сделало бы дубликаты всего, что было бы ошибкой. Таким образом, все задействованные файлы могут использовать все функции во всех заголовках, включенных до этого момента.

Что происходит, когда я пересылаю объявление какой-либо функции? Это функция теперь "сохранен", и я могу использовать его где угодно или он известен только тем же файл? тогда почему два файла с include (файлу со стражами) будут работать?

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

Могу ли я просто включить каждую вещь в основную и больше не буду беспокоиться?

Возможно. Как только вы перейдете к более сложным примерам, вы получите циклические зависимости, которые требуют определенных вещей, которые должны быть объявлены и / или определены в определенном порядке. Кроме этого, да. Вы можете включить все в основном и сохранить его простым. Тем не менее, ваш код займет навсегда для компиляции.

А почему в файлах cpp должны быть заголовки ?? Что если я их не включу?

Тогда этот файл .cpp не будет знать, что что-то еще существует вне его. Не очень полезно

0 голосов
/ 22 октября 2011

Краткий ответ: Пересылка класса / функции позволяет компилятору фактически не собирать весь класс / функцию без необходимости.

Длинный ответ: Пересылка класса / функции аналогична объявлению класса / функции без ее определения. Вы обещаете определить это позже, но сейчас вы просто хотите сообщить компилятору, что он существует. Вы обычно делаете это прямое замедление в заголовочных файлах. Как правило, это приводит к более быстрому времени компиляции, потому что в файлах .cpp, которые включают ваш заголовок, только те, которые действительно нуждаются в классе, который вы перенаправили и включают соответствующий заголовочный файл, должны фактически скомпилировать код этого включенного класса.

...