Preguntas más frecuentes sobre la biblioteca estándar de C++

En este artículo se proporciona una lista de las preguntas más frecuentes (P+F) sobre las bibliotecas estándar de C++ y las respuestas a esas preguntas.

Versión original del producto: Visual C++
Número de KB original: 154419

¿Qué contiene la biblioteca estándar de C++?

La biblioteca estándar de C++ proporciona un marco extensible y contiene componentes para la compatibilidad con lenguajes, diagnósticos, utilidades generales, cadenas, configuraciones regionales, biblioteca de plantillas estándar (contenedores, iteradores, algoritmos y valores numéricos) y entrada y salida.

La biblioteca estándar de C++ se puede dividir en las siguientes categorías:

  1. Los componentes de la biblioteca de plantillas estándar (STL) proporcionan un programa de C++ con acceso a un subconjunto de los algoritmos y estructuras de datos más usados. Los encabezados STL se pueden agrupar en tres conceptos de organización principales:

    • Contenedores: clases de plantilla que admiten formas comunes de organizar datos, como vector, , dequelist, stack, queue, sety map.

    • Algoritmos: funciones de plantilla para realizar operaciones comunes en secuencias de objetos, como funcional, algoritmo y numérico.

    • Iteradores: el pegado que pega algoritmos y contenedores juntos, como la utilidad, el iterador y la memoria.

  2. Input/Output incluye componentes para declaraciones directas de iostreams (iosfwd), objetos predefinidos iostreams (iostream), clases base iostreams (ios), búfer de secuencias (streambuf), formato de secuencia y manipuladores (iosmanip, istream, ostream), secuencias de cadena (sstream) y secuencias de archivos (fstream).

  3. Otros encabezados estándar de C++ incluyen:

    • Compatibilidad con lenguajes: componentes para definiciones de tipos comunes usadas en toda la biblioteca (cstddef), características de los tipos predefinidos (limits, cfloat, climits), funciones que admiten el inicio y finalización de un programa de C++ (cstdlib), compatibilidad con la administración dinámica de memoria (new), compatibilidad con la identificación dinámica de tipos (typeinfo), compatibilidad con el procesamiento de excepciones (exception) y otra compatibilidad en tiempo de ejecución (cstdarg, ctime, csetlmp, csignal).

    • Diagnóstico: componentes para notificar varios tipos de condiciones excepcionales (stdexcept), documentar aserciones de programa (cassert) y una variable global para códigos de número de error (cerrno).

    • Cadenas: componentes para clases de cadena (string) y utilidades de secuencia terminadas en NULL (cctype, cwctype, cwchar).

    • Localización: componentes que los programas de C++ pueden usar para encapsular las diferencias culturales. La instalación de configuración regional incluye compatibilidad con la internacionalización para la clasificación de caracteres y la intercalación de cadenas, el formato y el análisis numéricos, monetarios y de fecha y hora, y la recuperación de mensajes (locale, clocale).

¿Cuál es la diferencia entre CRT y la biblioteca estándar de C++? Qué bibliotecas incluirán las opciones del compilador de bibliotecas en tiempo de ejecución

Visual C++ incluye las siguientes bibliotecas además de las bibliotecas de Microsoft Foundation Classes (MFC):

  • Biblioteca básica de C-Runtime
  • Biblioteca estándar de C++
Tipos de biblioteca y modificadores de compilador relacionados Biblioteca básica en tiempo de ejecución de C/Biblioteca estándar de C++
Subproceso único (/ML) LIBC. LIB/LIBCP. LIB
Depuración de un solo subproceso (/MLd) LIBCD. LIB/LIBCPD. LIB
Multithreaded (/MT) LIBCMT. LIB/LIBCPMT. LIB
Depurar multiproceso (/MTd) LIBCMTD. LIB/LIBCPMTD. LIB
DLL multiproceso (/MD) MSVCRT. LIB/MSVCPRT. LIB
Depurar multiproceso /DLL (MDd) MSVCRTD. LIB/MSVCPRTD. LIB

Nota:

  • Las opciones del compilador de bibliotecas /ML y /MLd para bibliotecas de un solo subproceso estáticas se han quitado en Visual C++.
  • MSVCPRT.lib y MSVCPRTD.lib son bibliotecas estáticas y no tienen bibliotecas de vínculos dinámicos (DLL) directamente relacionadas con ellas. Estas bibliotecas también dependen de MSVCRT.lib y MSVCRTD.lib, respectivamente. Si tiene aplicaciones que usan MSVCPRT.lib o MSVCPRTD.lib y usa la opción Omitir biblioteca predeterminada (/NOD o NODEFAULTLIB), asegúrese de vincular MSVCPRT.lib (o MSVCPRTD.lib) y MSVCRT.lib (o MSVCRTD.lib) con la aplicación. De lo contrario, obtendrá errores del enlazador (LNK2001: externos sin resolver en MSVCPRT.lib o MSVCPRTD.lib) al vincular la aplicación. En función de los encabezados que use en el código, también se puede vincular una biblioteca de la biblioteca estándar de C++.

El archivo de encabezado use_ansi.h contiene #pragma instrucciones que obligan a vincular la biblioteca estándar de C++. Todos los encabezados estándar de C++ incluyen use_ansi.h: si incluye algún encabezado estándar de C++ en la aplicación, la biblioteca estándar de C++ se vinculará de forma predeterminada.

Encabezados de C++ estándar

Columna 1 Columna 2 Columna 3 Columna 4
ALGORITMO BITSET COMPLEJO DEQUE
EXCEPCIÓN FSTREAM FUNCIONAL IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
ITERADOR LÍMITES LISTA CONFIGURACIÓN REGIONAL
MAPA MEMORIA NUMÉRICO OSTREAM
QUEUE ESTABLECER SSTREAM PILA
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO UTILIDAD VALARRAY VECTOR

Cómo conservar la funcionalidad "iostream" antigua de Visual C++ .NET 2003 o versiones anteriores si porto mi proyecto desde una versión anterior

Si desea conservar la biblioteca antigua iostream (iostream.h), incluya uno o varios de los archivos de encabezado antiguos iostream en el código. No use los nuevos encabezados estándar de C++. No se pueden combinar llamadas a la biblioteca antigua iostream y a la nueva biblioteca estándar de C++.

Cómo hacer que las bibliotecas estándar de C++ sean las bibliotecas predeterminadas para mi aplicación

Si desea que las bibliotecas estándar de C++ sean las predeterminadas, incluya uno o varios de los nuevos encabezados estándar de C++. No se pueden combinar llamadas a la biblioteca de C++ estándar antigua iostream y a la nueva. Las bibliotecas existentes (vínculo estático o dinámico) que usan funciones antiguas iostream tendrán que modificarse para usar funciones de biblioteca iostream estándar de C++.

Si uso bibliotecas estándar de C++ en aplicaciones MFC, provocará conflictos con las bibliotecas de C-Runtime.

No. Microsoft Foundation Classes (MFC) no usa ninguna función de C-Runtime que entre en conflicto con las bibliotecas estándar de C++.

Por qué obtengo un error (error C2065: ''cout'' : identificador no declarado) aunque haya incluido 'iostream'

La biblioteca estándar de C++ se implementa en su propio espacio de nombres std. Asegúrese de agregar la siguiente instrucción al principio del programa:

using namespace std;

O califique cada identificador de biblioteca estándar de C++ con el espacio de nombres std, por ejemplo, std::cout.

Por qué obtengo un error (error del compilador C2371: redefinición de 'identificador'; diferentes tipos básicos)

En las versiones de Visual C++ anteriores a Visual C++ 2005, la combinación de encabezados estándar de C++ y encabezados antiguos iostream provoca este error, incluso si se incluyen en archivos de origen diferentes. A continuación se muestran los distintos encabezados:

  • Encabezados antiguos iostream :

    Columna 1 Columna 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Encabezados de C++ estándar:

    Columna 1 Columna 2 Columna 3 Columna 4
    ALGORITMO BITSET COMPLEJO DEQUE
    EXCEPCIÓN FSTREAM FUNCIONAL IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    ITERADOR LÍMITES LISTA CONFIGURACIÓN REGIONAL
    MAPA MEMORIA NUMÉRICO OSTREAM
    QUEUE ESTABLECER SSTREAM PILA
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO UTILIDAD VALARRAY VECTOR

Por qué recibo el mensaje (LNK2001: símbolo externo sin resolver "symbol" ;) en llamadas de función "iostream" cuando el proyecto se compila con Omitir bibliotecas predeterminadas

Las iostream funciones se han quitado de la biblioteca de C-Runtime.

Si usa las funciones antiguas iostream , debe agregar otra biblioteca LIBCI.lib ( ML de un solo subproceso), LIBCIMT.lib ( MT multiproceso) o MSVCIRT.lib (dll multiproceso MD). Estas bibliotecas se han quitado de Visual C++.

Si usa las nuevas iostream funciones incluidas en la biblioteca estándar de C++, debe agregar otra biblioteca LIBCP.lib ( ML de un solo subproceso), LIBCPMT.lib ( MT multiproceso) o MSVCPRT.lib(md. multiproceso).

No mezcle diferentes versiones de las bibliotecas. Por ejemplo, si usa la versión de un solo subproceso de la biblioteca de C-Runtime, también debe usar la versión de un solo subproceso de la biblioteca antigua iostream o la biblioteca estándar de C++.

No se pueden combinar las llamadas a las funciones de biblioteca antiguas iostream y las nuevas funciones de biblioteca iostream estándar de C++.

¿Por qué recibo las advertencias del compilador C4786 o C4788? Ninguno de los símbolos de mi programa tiene casi 255 caracteres

C4786 o C4788 se emiten cuando el nombre de un símbolo supera los 255 caracteres de longitud. Este problema suele producirse con la clase de plantilla y STL usa ampliamente la clase de plantilla.

Omitir esta advertencia es seguro. Use una #pragma advertencia (deshabilitar: 4786 4788) para suprimir los mensajes.

Por qué recibo el mensaje (C4530: se usa el controlador de excepciones de C++, pero la semántica de desenredado no está habilitada. Especificar -GX)

Los programas que usan la biblioteca estándar de C++ deben compilarse con el control de excepciones de C++ habilitado. El control de excepciones de C++ se puede habilitar mediante uno de los métodos siguientes:

  • Al seleccionar la opción Habilitar control de excepciones en la categoría de lenguaje de C++ de la pestaña C/C++ del cuadro de diálogo Configuración del proyecto .
  • Usar el modificador del compilador /GX .

Por qué obtengo el error del compilador C2146, seguido de C2065 y, por último, C2143, todos apuntando a la misma línea en mi origen.

Esta secuencia de errores puede deberse al siguiente tipo de construcción:

vector<int, allocator<int>>iV;

El problema se debe al consecutivo >> al final de la declaración. La solución consiste en colocar un espacio entre dos caracteres, por lo que la construcción se convierte en:

vector<int, allocator<int> > iV;

Es coherente con la especificación ANSII propuesta.