web-dev-qa-db-fra.com

Qu'est-ce que l'en-tête <iosfwd>?

Quel est le <iosfwd> header utilisé pour? Pourquoi est-ce nécessaire?

Un exemple?

65
wp2

C'est pour que vous puissiez déclarer, dans vos propres en-têtes, des méthodes qui s'appuient sur les déclarations des types iostream sans avoir à #include les en-têtes iostream eux-mêmes, qui sont grands, complexes et lents à compiler.

Voici un exemple simple:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

// foo.cc
#include <iostream>

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

Comme @ Marcelo Cantos mentionné, c'est pour que vous puissiez inclure la déclaration des classes et fonctions iostream sans inclure les définitions complètes. En C et C++, une déclaration est une déclaration qui dit "voici le nom de quelque chose (une fonction/classe/etc.), Mais je ' je ne vais pas vous en dire plus que son nom ". Pour une fonction, cela signifie le nom de la fonction, mais pas le corps contenant le code de la fonction. Pour une classe, cela signifie le nom de la classe mais aucune des variables ou méthodes membres de la classe.

Inversement, une définition est la définition complète: le corps de la fonction, les membres de la classe, etc.

Souvent, vous n'avez besoin que de la déclaration de quelque chose à utiliser - dans le cas d'une fonction, vous n'avez pas besoin de savoir à quoi ressemble le corps de la fonction pour l'appeler (sauf dans le cas de fonctions modèles ou intégrées). De même, avec une classe, vous n'avez pas besoin de connaître les membres de la classe si vous ne faites que passer des pointeurs ou des références à des instances de cette classe. Mais dès que vous devez accéder à une variable membre ou appeler une méthode de classe, vous avez besoin de la définition complète.

En incluant uniquement les déclarations au lieu des définitions, la quantité totale de code que le compilateur doit traiter est beaucoup, beaucoup moins, et donc la compilation se déroulera beaucoup plus rapidement.

Pour vous donner une idée de la quantité de code en cours de traitement, voici la quantité de code contenue dans mon implémentation locale:

# 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

Un fichier qui comprend <iosfwd>, le compilateur doit traiter 2598 lignes de code à partir de divers fichiers d'en-tête, tandis qu'un fichier qui comprend <iostream> doit traiter un énorme 25631 lignes de code. C'est avant de compiler le code réel dont vous vous souciez dans votre fichier source!

34
Adam Rosenfield

Fondamentalement, lorsque vous utilisez <iosfwd> est parce que vous voulez éliminer les dépendances au moment de la compilation.

Tu utilises <iosfwd> au lieu des en-têtes de flux traditionnels (<iostream> et amis) pour éviter d'inclure la définition de tout le contenu en streaming. Avec <iosfwd> vous ne faites qu'une déclaration directe de tous les contenus en streaming.

J'ai trouvé ce lien particulièrement utile: http://www.gotw.ca/gotw/007.htm

12
Lesswire