Forum aux questions sur la bibliothèque C++ standard

Cet article présente une liste de questions fréquemment posées sur les bibliothèques C++ standard et les réponses à ces questions.

Version du produit d’origine :   Visual C++
Numéro de la base de connaissances initiale :   154419

Question 1 : signification de la bibliothèque C++ standard

La bibliothèque C++ standard fournit une infrastructure extensible et contient des composants pour la prise en charge linguistique, les Diagnostics, les utilitaires généraux, les chaînes, les paramètres régionaux, la bibliothèque de modèles standard (conteneurs, itérateurs, algorithmes et Numerics) et les entrées/sorties.

La bibliothèque C++ standard peut être divisée en plusieurs catégories :

  1. Les composants STL (Standard Template Library) fournissent un programme C++ qui permet d’accéder à un sous-ensemble des algorithmes et des structures de données les plus couramment utilisés. Les en-têtes STL peuvent être regroupés en trois concepts principaux :

    • Containers : classes de modèles qui prennent en charge des méthodes courantes d’organisation des données, telles que,,,,, vector list deque stack queue set et map .

    • Algorithmes : fonctions de modèle permettant d’effectuer des opérations courantes sur des séquences d’objets, telles que la fonctionnalité, l’algorithme et le numérique.

    • Itérateurs : le collage qui colle les algorithmes et les conteneurs ensemble, comme l’utilitaire, l’itérateur et la mémoire.

  2. L’entrée/sortie inclut les composants pour les déclarations de type iostreams ( iosfwd ), les objets iostreams prédéfinis ( iostream ), les classes iostreams de base ( ios ), la mise en mémoire tampon des flux () streambuf , la mise en forme de flux et les manipulateurs ( iosmanip , istream , ostream ), les flux de chaînes ( sstream ) et les flux de fichiers ( fstream ).

  3. Les autres en-têtes C++ standard sont les suivants :

    • Prise en charge des langues : composants des définitions de type communes utilisées dans la bibliothèque ( cstddef ), caractéristiques des types prédéfinis ( limits , cfloat , climits ), fonctions de prise en charge du démarrage et de l’arrêt d’un programme C++ ( cstdlib ), prise en charge de la gestion de la mémoire dynamique (), new typeinfo exception cstdarg ctime csetlmp csignal prise en charge de l’identification du type dynamique ()

    • Diagnostics : composants permettant de signaler plusieurs types de conditions exceptionnelles ( stdexcept ), de documenter des assertions de programme ( cassert ) et une variable globale pour les codes de numéros d’erreur ( cerrno ).

    • Strings : composants pour les classes String ( string ) et les utilitaires de séquence se terminant par null ( cctype , cwctype , cwchar ).

    • Localisation : composants que les programmes C++ peuvent utiliser pour encapsuler les différences culturelles. La fonctionnalité paramètres régionaux inclut la prise en charge de l’internationalisation pour la classification des caractères et le classement des chaînes, la numérotation numérique, monétaire et la date/heure et l’analyse, ainsi que la récupération des messages ( locale , clocale ).

Question 2 : quelle est la différence entre CRT et la bibliothèque C++ standard ? Les bibliothèques que les options du compilateur de bibliothèque Runtime incluent

Visual C++ inclut les bibliothèques suivantes en plus des bibliothèques MFC (Microsoft Foundation classes) :

  • Bibliothèque C-Runtime de base
  • Bibliothèque C++ standard
Types de bibliothèque et commutateurs de compilateur associés Bibliothèque Runtime C de base/bibliothèque C++ standard
Single-Threading (/ML) LIBC. LIB/LIBCP. MANQUANT
Débogage à thread unique (/MLd) LIBCd. LIB/LIBCPD. MANQUANT
Multithread (/MT) LIBCMT. LIB/LIBCPMT. MANQUANT
Débogage multithread (/MTd) Bogage. LIB/LIBCPMTD. MANQUANT
DLL multithread (/MD) MSVCRT. LIB/MSVCPRT. MANQUANT
Débogage de l'/DLL multithread (MDd) Bogage. LIB/MSVCPRTD. MANQUANT

Notes

  • Les options du compilateur /ml et /MLD Library pour les bibliothèques à thread unique statique ont été supprimées dans Visual C++.
  • Msvcprt. lib et MSVCPRTD. lib sont des bibliothèques statiques et n’ont aucune bibliothèque de liens dynamiques (dll) directement associées. Ces bibliothèques dépendent également de Msvcrt. lib et de msvcrtd. lib, respectivement. Si vous avez des applications qui utilisent Msvcprt. lib ou MSVCPRTD. lib et que vous utilisez l’option ignorer la bibliothèque par défaut (/NOD ou NODEFAULTLIB), vous devez lier Msvcprt. lib (ou MSVCPRTD. lib) et Msvcrt. lib (ou msvcrtd. lib) à votre application. Dans le cas contraire, vous obtiendrez des erreurs de l’éditeur de liens (LNK2001 : externals non résolues dans Msvcprt. lib ou MSVCPRTD. lib) lors de la liaison de votre application. En fonction des en-têtes que vous utilisez dans votre code, une bibliothèque de la bibliothèque C++ standard peut également être liée.

Le fichier d’en-tête use_ansi. h contient des #pragma instructions qui forcent la bibliothèque C++ standard à être liée. Tous les en-têtes C++ standard incluent use_ansi. h: Si vous incluez un en-tête c++ standard dans votre application, la bibliothèque c++ standard sera liée par défaut.

En-têtes C++ standard

Colonne 1 Colonne 2 Colonne 3 Colonne 4
ALGORITHME BITSET DIFFICULTÉS DEQUE
ROGATION FSTREAM DYSFONCTIONNEMENT IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
RÉPÉTITEUR Limit INSCRIT PARAMÈTRES régionaux
CALQUE UTILISÉE ALPHANUMÉRIQUE OSTREAM
QUEUE Jeux SSTREAM CUMULÉ
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO Initialization VALARRAY ATTAQUE

Question 3 : Comment conserver les anciennes fonctionnalités iostream de Visual C++ .NET 2003 ou des versions antérieures si je porte mon projet à partir d’une version antérieure

Si vous souhaitez conserver l’ancienne iostream bibliothèque (iostream. h), incluez un ou plusieurs des anciens iostream fichiers d’en-tête dans votre code. N’utilisez pas les nouveaux en-têtes C++ standard. Vous ne pouvez pas mélanger les appels à l’ancienne iostream bibliothèque et à la nouvelle bibliothèque C++ standard.

Question 4 : Comment faire des bibliothèques C++ standard les bibliothèques par défaut pour mon application

Si vous souhaitez que les bibliothèques C++ standard soient la valeur par défaut, incluez un ou plusieurs des nouveaux en-têtes C++ standard. Vous ne pouvez pas mélanger les appels vers l’ancienne iostream et la nouvelle bibliothèque C++ standard. Les bibliothèques existantes (lien statique ou dynamique) qui utilisent les anciennes iostream fonctions devront être modifiées pour utiliser les fonctions de la bibliothèque C++ standard iostream .

Question 5 : utilisera les bibliothèques C++ standard dans les applications MFC cause de conflits avec les bibliothèques C-Runtime

Non. Microsoft Foundation classes (MFC) n’utilise aucune fonction Runtime C qui entre en conflit avec les bibliothèques C++ standard.

Question 6 : pourquoi j’obtiens une erreur (erreur C2065 : 'cout' : identificateur non déclaré) même si I inclut iostream

La bibliothèque C++ standard est implémentée dans son propre espace de noms std . Veillez à ajouter l’instruction suivante au début de votre programme :

using namespace std;

Ou qualifier chaque identificateur de bibliothèque C++ standard par un espace std de noms, par exemple std::cout .

Question 7 : pourquoi j’obtiens une erreur (erreur du compilateur C2371 : 'identificateur', redéfinition ; différents types de base)

Dans les versions de Visual C++ antérieures à Visual C++ 2005, le mélange des en-têtes C++ standard et des anciens iostream en-têtes provoque cette erreur, même s’ils sont inclus dans des fichiers sources différents. Les différents en-têtes sont les suivants :

  • Anciens iostream en-têtes :

    Colonne 1 Colonne 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • En-têtes C++ standard :

    Colonne 1 Colonne 2 Colonne 3 Colonne 4
    ALGORITHME BITSET DIFFICULTÉS DEQUE
    ROGATION FSTREAM DYSFONCTIONNEMENT IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    RÉPÉTITEUR Limit INSCRIT PARAMÈTRES régionaux
    CALQUE UTILISÉE ALPHANUMÉRIQUE OSTREAM
    QUEUE Jeux SSTREAM CUMULÉ
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO Initialization VALARRAY ATTAQUE

Question 8 : pourquoi j’obtiens un message (LNK2001 : symbole externe non résolu’symbole';) pour les appels de fonction iostream lorsque le projet est généré avec ignorer les bibliothèques par défaut

Les iostream fonctions ont été supprimées de la bibliothèque Runtime C.

Si vous utilisez les anciennes iostream fonctions, vous devez ajouter une bibliothèque Libci. lib supplémentaire (à thread unique), ML LIBCIMT. lib ( MTMultithreaded) ou msvcirt. lib (DLL multithread MD). Ces bibliothèques ont été supprimées de Visual C++.

Si vous utilisez les nouvelles iostream fonctions incluses dans la bibliothèque C++ standard, vous devez ajouter une bibliothèque supplémentaire LIBCP. lib ( mlà thread unique), LIBCPMT. lib ( MTmultithread) ou Msvcprt. lib (DLL multithread MD).

Ne mélangez pas les différentes versions des bibliothèques. Par exemple, si vous utilisez la version à thread unique de la bibliothèque Runtime C, vous devez également utiliser la version à thread unique de l’ancienne bibliothèque ou de la iostream bibliothèque C++ standard.

Vous ne pouvez pas mélanger les appels aux anciennes fonctions de la iostream bibliothèque et aux nouvelles fonctions de la bibliothèque C++ standard iostream .

Question 9 : Pourquoi puis-je obtenir les avertissements du compilateur C4786 ou C4788 ? Aucun des symboles de mon programme n’a une longueur proche de 255 caractères.

C4786 ou C4788 est émis lorsque le nom d’un symbole dépasse 255 caractères. Cela se produit souvent avec la classe de modèle et STL utilise largement la classe de modèle.

Ignorer cet avertissement est fiable. Utilisez un #pragma avertissement (désactiver : 4786, 4788) pour supprimer les messages.

Question 10 : pourquoi j’obtiens un message (C4530 : le gestionnaire d’exceptions C++ est utilisé, mais les sémantiques de déroulement ne sont pas activées. Specify-GX)

Les programmes qui utilisent la bibliothèque C++ standard doivent être compilés avec la gestion des exceptions C++ activée. La gestion des exceptions C++ peut être activée à l’aide de l’une des méthodes suivantes :

  • Sélectionnant l’option activer la gestion des exceptions dans la catégorie langage c++ de l’onglet C/C++ dans la boîte de dialogue paramètres du projet .
  • À l’aide du commutateur de compilateur /GX .

Question 11 : pourquoi j’obtiens une erreur de compilation C2146, suivie de C2065 et enfin de C2143, tout pointant sur la même ligne dans ma source

Cette séquence d’erreurs peut être causée par le type de construction suivant :

vector<int, allocator<int>>iV;

Le problème est dû à la suite consécutive >> à la fin de la déclaration. La solution consiste à placer un espace entre deux caractères, de sorte que la construction devienne :

vector<int, allocator<int> > iV;

Cette fonction est cohérente avec la spécification ANSIi proposée.