La biblioteca estándar C (también conocida como libc , crt ) es la parte del estándar ANSI C dedicada a los archivos de encabezado y las rutinas de biblioteca . Es una descripción de la implementación de operaciones comunes como E/S y procesamiento de cadenas en el lenguaje de programación C. La biblioteca estándar de C es una descripción de una interfaz de programación , no una verdadera biblioteca utilizable en el proceso de compilación .
El nombre y las características de cada función se especifican en un archivo denominado archivo de encabezado , pero la implementación actual de las funciones se describe por separado en un archivo de biblioteca . Los nombres y capacidades de los archivos de encabezado se vuelven comunes, pero la organización de las bibliotecas sigue siendo heterogénea. La biblioteca estándar generalmente viene con el compilador . Debido a que los compiladores de C a menudo brindan una funcionalidad extendida no definida por el estándar ANSI C , la biblioteca estándar de un compilador es incompatible con las bibliotecas estándar de otros compiladores.
Gran parte de la biblioteca estándar de C parece estar bien diseñada. Algunas de las partes individuales que han sido ventajosas en el pasado pueden ser propensas a errores. Las funciones de entrada de cadenas gets()(y el uso scanf()para leer cadenas de entrada) son la fuente de muchos desbordamientos de búfer , por lo que la mayoría de las guías de programación le aconsejan que evite estos trucos. La característica strcpy()también es bastante infame. Otra función ambigua es strtok() : una función diseñada como un simple analizador léxico , pero que tiene muchas "trampas" y, por lo tanto, es muy difícil de usar.
La opción de usar el tipo size_ten lugar de intpara el número de elementos especificado para fread()y fwrite()es inconsistente con la semántica general desarrollada para size_t(para representar el número de bytes).
stdioes bastante limitado (nivel demasiado alto para usarse en muchas situaciones) y el estándar no permite que el usuario reasigne o amplíe sus propiedades por sí mismo. Como resultado, muchas aplicaciones desarrollan sus propias bibliotecas contenedoras en torno a mecanismos y funciones de nivel inferior implementados por el sistema operativo, como POSIX . Por ejemplo, stdiono funcionan con señales o modos de E/S sin ráfagas asíncronos que se usan ampliamente en servidores de red. Como resultado, stdiosolo los servidores pueden confiar plenamente en las funciones que utilizan el modelo de proceso completo para que el cliente las sirva en sistemas compatibles con POSIX en E/S por lotes.
Ciertas características de la biblioteca estándar deben evitarse cuando se desarrollan aplicaciones multiproceso . Las primitivas de control de subprocesos estaban destinadas al resto del sistema operativo e ignoran los estándares comunes como la biblioteca de subprocesos POSIX, esperando que los programadores de C se encarguen de ello ellos mismos, trabajando con la reutilización y la sincronización. Ni el lenguaje C ni su biblioteca estándar verifican tales resultados específicos del sistema de ninguna manera.
El lenguaje de programación C , antes de la estandarización, no proporcionaba funciones integradas como operaciones de E/S (a diferencia de los lenguajes tradicionales como Cobol y Fortran ). Más tarde, surgieron ideas en la comunidad de programación de C que se implementaron en lo que ahora llamamos Biblioteca estándar de C para admitir esta funcionalidad. La mayoría de estas ideas eventualmente se unieron para definir el estándar del lenguaje de programación C.
Tanto Unix como C se crearon en los Laboratorios Bell de AT&T a fines de la década de 1960 y principios de la de 1970. En la década de 1970, el lenguaje de programación C comenzó a ser increíblemente popular. Muchas universidades y organizaciones han comenzado a crear sus propias versiones del idioma, más adecuadas a sus propias necesidades. Desde principios de la década de 1980, los problemas de compatibilidad entre diferentes implementaciones del lenguaje C se han vuelto demasiado evidentes. En 1983 , el American National Standards Institute (ANSI) formó un comité para adoptar un estándar para el lenguaje C, conocido como "ANSI C". Este trabajo resultó en la creación del llamado estándar C89 en 1989 . Parte del estándar resultante fue un conjunto de bibliotecas llamado ANSI C Standard Library .
Las versiones posteriores del estándar del lenguaje C agregaron algunos archivos de encabezado nuevos y más útiles a la biblioteca. El soporte para estas nuevas extensiones dependía de la implementación.
Los archivos de encabezado <iso646.h> , <wchar.h> y <wctype.h> se agregaron en el Apéndice 1 (abreviado como NA1 ), un apéndice del Estándar C ratificado en 1995 .
Los archivos de encabezado < complex.h> , <fenv.h> , <inttypes.h> , <stdbool.h > , <stdint.h> y <tgmath.h> se agregaron en C99 , una versión de C Standard publicado en 1999 .
La biblioteca estándar ANSI C consta de 24 archivos de encabezado, cada uno de los cuales se puede incluir en un proyecto de software con una sola directiva. Cada archivo de encabezado contiene una o más declaraciones de funciones, definiciones de tipos de datos y macros. El contenido de estos archivos de encabezado se enumeran a continuación.
En comparación con otros lenguajes (como Java ), la biblioteca estándar es extremadamente pequeña. La biblioteca proporciona soporte para el conjunto básico de funciones matemáticas, procesamiento de cadenas, conversión de tipos, E/S de archivo y consola. No contiene un conjunto estándar de "tipos de contenedores" como la biblioteca de plantillas estándar de C++ , componentes para trabajar con una interfaz gráfica de usuario (GUI), redes y otras funciones misceláneas que Java admite de forma estándar. La principal ventaja de la biblioteca estándar pequeña es que facilita el trabajo con el entorno ANSI C que con otros lenguajes y, por lo tanto, facilita la migración de programas C a nuevas plataformas.
Se han desarrollado muchas otras bibliotecas para admitir una funcionalidad similar proporcionada por otros idiomas en sus bibliotecas estándar. Por ejemplo, el Proyecto de desarrollo del entorno de escritorio GNOME desarrolló el conjunto de herramientas gráficas GTK+ y GLib , una biblioteca de estructuras de datos de contenedores, así como muchos otros ejemplos conocidos. La variedad de bibliotecas disponibles significa que algunas herramientas de alto nivel han demostrado ser útiles con el tiempo. Una desventaja importante es que a menudo no interactúan bien entre sí, por lo que los programadores suelen estar más acostumbrados a trabajar con diferentes conjuntos de bibliotecas y sus conjuntos pueden estar disponibles en diferentes plataformas específicas.
< afirmar.h > | Contiene la macro de afirmación , que se utiliza para detectar errores lógicos y de otro tipo en la versión del programa que se está depurando. |
< complejo.h > | Un conjunto de funciones para trabajar con números complejos . (Introducido en C99 ) |
< ctipo.h > | Contiene funciones que sirven para clasificar caracteres según su tipo, o para convertir entre mayúsculas y minúsculas, independientemente de la codificación utilizada (normalmente ASCII o alguna de sus extensiones, aunque existen implementaciones que utilizan EBCDIC ). |
< errno.h > | Para comprobar los códigos de error devueltos por las funciones de biblioteca. |
< fenv.h > | Para controlar un entorno que utiliza números de punto flotante . (Introducido en C99 ) |
< flotar.h > | Contiene constantes predefinidas que describen las especificaciones de implementación de las propiedades de la biblioteca para trabajar con números de punto flotante , como la diferencia mínima entre dos números de punto flotante diferentes (_EPSILON), el número máximo de dígitos de precisión (_DIG) y el rango de números válidos ( _MIN, _MAX ). |
< tiposint.h > | Para la conversión exacta de tipos enteros. (Introducido en C99 ) |
< iso646.h > | Para programar en codificación ISO 646 . (Aparecido en NA1 ) |
< limites.h > | Contiene constantes predefinidas que definen las especificaciones de implementación de las propiedades de tipos enteros, como el rango de valores válidos (_MIN, _MAX). |
< entorno local.h > | Para setlocale() y constantes relacionadas. Se utiliza para seleccionar el idioma apropiado . |
< matemáticas.h > | Para calcular funciones matemáticas básicas |
< setjmp.h > | Declara macros setjmpy se longjmputiliza para saltos no locales |
< señal.h > | Para controlar el procesamiento de la señal |
< stdarg.h > | Para acceder a un número diferente de argumentos pasados a las funciones. |
< stdbool.h > | Para tipos de datos booleanos. (Introducido en C99 ) |
< stdint.h > | Definir diferentes tipos de enteros. (Introducido en C99 ) |
< stddef.h > | Para definir varios tipos estándar y macros. |
< stdio.h > | Implementa capacidades básicas de entrada y salida en lenguaje C. Este archivo contiene una función muy importante printf. |
< stdlib.h > | Para realizar una variedad de operaciones, incluida la conversión, la generación de números pseudoaleatorios , la asignación de memoria, el control de procesos, el control del entorno, las señales, la búsqueda y la clasificación. |
< cadena.h > | Para trabajar con diferentes tipos de cuerdas. |
< tgmatemáticas.h > | Para funciones matemáticas típicas. (Introducido en C99 ) |
< hilos.h > | El archivo de encabezado <threads.h> junto con <stdatomic.h> brinda soporte para la programación paralela. (Introducido en C11 ) |
< tiempo.h > | Para convertir entre diferentes formatos de fecha y hora. |
< wchar.h > | Para manejar flujos "anchos" y múltiples tipos de cadenas usando caracteres "anchos" (soporte de conjunto de idiomas). (Aparecido en NA1 ) |
< wctipo.h > | Para clasificar caracteres "anchos". (Aparecido en NA1 ) |
Algunos lenguajes brindan la funcionalidad de la biblioteca estándar de C con sus propias bibliotecas. La biblioteca se puede adaptar a las estructuras del lenguaje, pero la semántica de las operaciones sigue siendo similar. El lenguaje de programación C++ , por ejemplo, contiene la funcionalidad de la biblioteca estándar ANSI C en el espacio de nombres estándar ( p. ej.,,, etc. ) , en archivos de encabezado con nombres C similares (" "", " " ", " ", etc.) . .). Otros lenguajes que adoptan enfoques similares incluyen, por ejemplo, D y Python . En este último, por ejemplo, el archivo de objeto incorporado se define como "implementado por el paquete C stdio" [1] , por lo que se espera que las operaciones disponibles (abrir, leer, escribir, etc.) se comporten como el C correspondiente Funciones de lenguaje. std::printfstd::atoistd::feofcstdiocmathcstdlib
Todavía no está estandarizado, pero los programas C pueden depender de bibliotecas de subrutinas que contienen código utilizado por el compilador en tiempo de ejecución. El código que inicializa el proceso para el sistema operativo, por ejemplo, antes de llamar a main(), se implementa en la biblioteca en tiempo de ejecución de C (CRT) para esta versión del compilador. El código de la biblioteca CRT puede ayudar a implementar otras características del lenguaje, como el manejo de excepciones no detectadas o la implementación de números de punto flotante.
La biblioteca estándar de C solo regula la presencia de las subrutinas anteriores y su comportamiento. Dado que la implementación del compilador puede depender de la presencia de estas funciones adicionales, todo depende de qué rutinas se compilan en la biblioteca estándar de C, por lo que cualquier programa desarrollado con ellas las necesitará.
Aunque a menudo se confunden con la biblioteca estándar de C debido a su agrupación, la biblioteca CRT no es una parte estandarizada del lenguaje y depende de cómo se entregue el software.
Algunos compiladores (p. ej ., GCC [1] ) admiten versiones internas de muchas funciones en la biblioteca estándar de C; es decir, las implementaciones de funciones se escriben en el módulo de objeto compilado y el programa llama a las versiones internas en lugar de las funciones de biblioteca C compartidas. Esto reduce la sobrecarga de la llamada de función, especialmente si la llamada de función se reemplaza por variantes integradas , y se permiten otras formas de optimizaciones (si el compilador admite el control de las características de las variantes internas), pero puede generar problemas de depuración (por ejemplo, versiones internas). no puede ser reemplazada por versiones de herramienta ).
POSIX (y SUS ) definen una serie de subrutinas que pueden estar disponibles más allá de las definidas en la biblioteca estándar de C; a menudo implementan una funcionalidad similar a la biblioteca estándar, con diversos grados de similitud. Por ejemplo, glibc implementa funciones como fork en libc.so, pero las bibliotecas de transmisión se fusionan en glibc antes de llamarlas, aunque se anuncia como una biblioteca separada con su propio indicador de enlace. A menudo, dicha funcionalidad compatible con POSIX se considera parte de la biblioteca; por lo tanto, la biblioteca C correspondiente puede identificarse como una biblioteca C ANSI o ISO .
Hay muchas implementaciones que vienen con varios sistemas operativos y compiladores de C. En los sistemas BSD , por ejemplo, la biblioteca del sistema está integrada en el sistema operativo y es mantenida por un repositorio fuente compartido. En la mayoría de los sistemas, la biblioteca se puede encontrar con el nombre " libc".
Aunque hay muchas implementaciones, aquí hay una pequeña lista de las bibliotecas más populares:
lenguaje de programación c | |
---|---|
compiladores |
|
bibliotecas | |
Peculiaridades | |
algunos descendientes | |
C y otros lenguajes |
|
Categoría:Lenguaje de programación C |