6
votes

Question de base sur l'inclusion de fichier d'en-tête C ++?

Quelles sont les différences entre les 3 programmes ci-dessous?. Est un fichier d'en-tête ou une bibliothèque standard C ++?

1. xxx

2. xxx

3 . xxx

merci d'avance.


5 commentaires

Dans le deuxième programme, je n'ai pas inclus espace de noms, alors que va-t-il se passer?


Vous devrez écrire, par exemple, std :: cout au lieu de cout .


Il ressemble à un devoir de l'étudiant ... n'est-ce pas?


S'il vous plaît ne devinez pas sur l'étiquette des devoirs. Ce n'est évidemment pas une question de devoirs collé par une copie, et c'est quelque chose qui pourrait raisonnablement être interrogé par quiconque apprenant la langue C ++.


Je ne suppose pas: j'avais une question vraiment une question similaire dans un test il y a 5 ans.


4 Réponses :


1
votes

Vous les deux premiers programmes sont des programmes standard C ++ Standard, tandis que le 3ème programme utilise un fichier d'en-tête non standard

dans le programme 1ère à l'aide d'un espace de noms std apporte l'espace de noms complet std dans la portée.

regarder Ce pour Plus d'informations.


7 commentaires

L'en-tête n'a jamais fait partie d'une norme Y C ++ et ne peut donc pas être considérée comme obsolète, qui a une signification technique spécifique en C ++.


@Neil: devx.com/tips/tip/14447 dit clairement que est un fichier d'en-tête obsolète. Aussi pour désactiver l'avertissement que nous obtenons à l'aide de Nous utilisons l'option -wno-déprécée de GCC. Ensuite, je ne trouve pas la raison pour laquelle ne peut pas être qualifié de dépréciation? S'il vous plaît élaborer.


@Prason Saurav: C'est Devx.com, pas la norme.


Ce n'est pas une partie obsolète de la norme C ++, mais je discuterais, il est correct de dire que c'est une caractéristique obsolète de tout compilateur conforme aux normes.


Qui se soucie de ce que dit un lien Internet aléatoire? Les caractéristiques obsolètes de C ++ sont énumérées à l'annexe D de la norme C ++.


@Neil: oui vous êtes correct. Géré pour trouver des fonctionnalités obsolètes de C ++ à l'annexe D de la norme C ++. n'est pas obsolète.


Point juste cependant sur le drapeau non obscuré . Peut-être que "anachronistique" serait une meilleure description? En fin de compte, cela ( iostream.h ) ne devrait tout simplement pas être utilisé avec un compilateur moderne.



14
votes

En ce qui concerne le programme produit, il n'ya rien de différence - car rien dans la bibliothèque iostream est référencé par le programme, aucune de la bibliothèque ne sera compilée par un compilateur intelligent. < / p>

Lorsque vous #include , vous incluez le fichier d'en-tête avec des déclarations pour la bibliothèque Standard Standard. En utilisant #include fait essentiellement la même chose que #include , sauf qu'il définit tous les noms de la bibliothèque dans l'espace de noms global plutôt que d'être Dans std :: - Il est là pour la compatibilité inverse avec des programmes utilisés la version originale de iostream qui n'a pas laissé tomber le .h . (Les versions ne prennent souvent souvent pas en charge les caractères larges, mais seulement standard char 's.)

à l'aide de NAMESPACE STD; signifie que l'espace de noms par défaut pour les références de noms dans le fichier actuel sera std , qui est l'espace de noms utilisé par la plupart des fonctions de bibliothèque standard. Bien que cela signifie que vous n'avez pas à préfixer tous les appels de bibliothèque standard avec std :: , cela signifie également que vous devez faire attention à ne pas définir quoi que ce soit qui chevauche des noms de bibliothèque standard.


2 commentaires

En fait, je crois iostream.h met les choses dans l'espace de noms global (même si aucun compilateur sous le soleil ne le fait en réalité). Je peux me tromper.


@Billy: iostream.h n'existe pas dans la norme C ++, de sorte qu'il ne fait rien en général; Il faudrait spécifier quelle mise en œuvre. Il s'agit d'une relique de la pré-standard C ++, de retour avant les espaces de noms, donc sur une implémentation donnée qui l'a probablement identique à celle de #include suivi de en utilisant directives exporter tous ses symboles dans l'espace de noms global.



2
votes

iostream est un fichier d'en-tête qui fournit des déclarations et des prototypes une interface à une interface à la bibliothèque standard C ++.

Il y a, sur votre système, un fichier appelé "iostream" (aucune extension), dont le contenu est copié et collé (avec traitement récursif de #include s) au point où vous écrire #include .

#include Les directives tirent toujours dans le contenu des fichiers d'en-tête, ils n'ajoutent jamais "bibliothèques". Les fichiers d'en-tête contiennent souvent des déclarations et des prototypes d'une interface avec une bibliothèque, mais les bibliothèques réelles elles-mêmes sont jointes à votre programme par la liaison, pas le compilateur. Lors de la liaison d'un programme C ++, la liaison jointe automatiquement à la bibliothèque standard C ++, à moins que vous ne le disiez pas, vous n'avez donc pas à vous soucier de cela.

De même, le à l'aide de noms de noms Std ne fait pas le travail de joindre la bibliothèque. Cette déclaration ne fait que pour que vous puissiez écrire, par exemple, cout ou chaîne au lieu de les qualifier comme std :: COUT et STD :: String . Cela fonctionne pour n'importe quel espace de noms, mais est généralement découragé.

Pour les trois exemples que vous avez donnés, ils vous donnent tous les définitions et prototypes dont vous avez besoin d'utiliser la partie iostream de la bibliothèque standard C ++, mais (2) est préférable, (1) est acceptable et (3) est obsolète. . (2) donne la commodité supplémentaire de pouvoir omettre le préfixe std :: (au coût de la réduction des noms de variable disponibles pour que vous puissiez utiliser vous-même), et (3) inclut un fichier différent appelé "iostream.h" au lieu de "iostream", qui est généralement la même chose, mais le fichier avec le .h est une relique de pré-standard C ++ et peut donc ne pas être pris en charge dans les futurs compilateurs.


0 commentaires

3
votes

Il y a une erreur dans NO 3 Problème avec le fichier d'en-tête

L'en-tête iOSTREAM.H est un en-tête non standard et n'existe pas sur toutes les plateformes. En fait, cela n'existe pas sur mon système (en utilisant g ++ et le GNU LIBSTDC ++). Donc, n'importe quel code utilisant cela ne compilerait tout simplement pas sur mon système.

L'en-tête iostream.h utilisé pour être courant avant la première normalisation de C ++ en 1998. Mais depuis la norme 98 utilisée au lieu de , ce dernier est tombé de la faveur (non standard et tout) et n'est plus pris en charge sur toutes les plateformes. Code qui l'utilise doit être considéré comme un code hérité non standard et n'est pas portable. Les livres qui enseigne doivent être considérés comme obsolètes et évités.


0 commentaires