Что такое заголовок <iosfwd>? - PullRequest
       21

Что такое заголовок <iosfwd>?

57 голосов
/ 29 ноября 2010

Для чего используется заголовок <iosfwd> ?Зачем это нужно?

Любой пример?

Ответы [ 3 ]

57 голосов
/ 29 ноября 2010

Это так, что вы можете объявлять в своих собственных заголовках методы, которые полагаются на объявления типов iostream, без необходимости #include самих заголовков iostream, которые являются большими, сложными и медленными для компиляции.

Вот простой пример:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}
34 голосов
/ 29 ноября 2010

Как уже упоминалось @ Marcelo Cantos , вы можете включить объявление классов и функций iostream, не включая полные определения. В C и C ++ объявление - это утверждение, которое гласит: «здесь есть имя чего-то (функция / класс / и т. название". Для функции это означает имя функции, но не тело, содержащее код функции. Для класса это означает имя класса, но не какие-либо переменные или методы-члены класса.

И наоборот, определение - это полное определение: тело функции, члены класса и т. Д.

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

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

Чтобы дать вам представление о том, сколько кода обрабатывается, вот, сколько кода содержится в моей локальной реализации:

# The following commands create a source file that includes a single header
# file (on stdout), preprocess it with g++ -E, and then count how many lines
# are in the resulting preprocessed output
$ echo '#include <iosfwd>' | g++ -E -xc++ - | wc
    2598    6534   57875
$ echo '#include <iostream>' | g++ -E -xc++ - | wc
   25631   59613  631998

Файл, который включает <iosfwd>, компилятор должен обработать 2598 строк кода из различных заголовочных файлов, тогда как файл, который включает <iostream>, должен обработать колоссальные 25631 строк кода. Это до того, как вы скомпилируете нужный код в исходный файл!

11 голосов
/ 17 июля 2013

В основном, когда вы используете <iosfwd>, это потому, что вы хотите устранить зависимости во время компиляции.

Вы используете <iosfwd> вместо традиционных потоковых заголовков (<iostream> и друзья), чтобы можно было не включать определение всего потокового контента.С <iosfwd> вы только делаете предварительное объявление обо всех вещах.

Я нашел эту ссылку особенно полезной: http://www.gotw.ca/gotw/007.htm

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