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

Какой заголовок <iosfwd> используется для (упомянутый в этот файл)?

Почему это необходимо?

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

Ответ 1

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

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

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

 

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}

Ответ 2

Как упоминалось @Marcelo Cantos, так вы можете включить объявление классов и функций iostream без включения полных определений. В 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. Это до компиляции актуального кода, который вам нужен в исходном файле!

Ответ 3

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

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

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