La biblioteca estándar de C, o libc (no confundir con stdlib.h); es una recopilación de archivos de cabecera y bibliotecas con rutinas, estandarizadas por un comité de la Organización Internacional para la Estandarización (ISO), que implementan operaciones comunes, tales como las de entrada y salida o el manejo de cadenas. A diferencia de otros lenguajes como COBOL, Fortran, o PL/1, C no incluye palabras clave para estas tareas, por lo que prácticamente todo programa implementado en C se basa en la biblioteca estándar para funcionar.
El nombre y las características de cada función, el prototipo, así como la definición de algunos tipos de datos y macros, se encuentran en un fichero denominado archivo de cabecera (con extensión ".h"), pero la implementación real de las funciones están separadas en un archivo de la biblioteca. La denominación y el ámbito de las cabeceras se han convertido en comunes, pero la organización de las bibliotecas sigue siendo diversa, ya que éstas suelen distribuirse con cada compilador. Dado que los compiladores de C, a menudo, ofrecen funcionalidades adicionales que no están especificados en el ANSI C, la biblioteca de un compilador no siempre es compatible con el estándar ni con las bibliotecas de otros compiladores.
Está demostrado que la mayor parte de la biblioteca estándar de C ha sido bien diseñada, aunque se ha comprobado que algunas partes también son fuente de errores; funciones para entrada de cadenas como gets()
o scanf()
, producen desbordamientos de buffer, y muchas guías de programación recomiendan evitar su uso. La función strtok()
presenta otra singularidad, está diseñada para ser utilizada como un analizador léxico rudimentario, pero resulta difícil de utilizar además de ser muy frágil.
El lenguaje de programación C, antes de normalizarse, no disponía de funcionalidades tales como operaciones de entrada/salida (a diferencia de lenguajes tradicionales como COBOL y FORTRAN). Con el tiempo, las comunidades de usuarios de C fueron compartiendo ideas, así como las implementaciones de lo que ahora se denomina las bibliotecas estándar de C para proporcionar esas funcionalidades. Muchas de estas ideas se incorporaron finalmente en la definición estandarizada del lenguaje.
Tanto Unix como C fueron creados en los Laboratorios Bell de AT&T a finales de la década de los 60 y principios de los 70. Fue en los 70 cuando el lenguaje de programación C acrecentó su popularidad. Muchas organizaciones y universidades crearon sus propias versiones del lenguaje para sus propios proyectos. A comienzos de los 80 se evidenciaron los problemas de compatibilidad derivados de la existencia de las múltiples implementaciones del lenguaje. En 1983 el Instituto Nacional Estadounidense de Estándares (ANSI, de las siglas en inglés de American National Standards Institute) creó un comité para establecer una especificación estándar del lenguaje conocida como ANSI C. Este trabajo culminó con la creación del llamado estándar C89 en 1989. Una parte del estándar resultante fue un conjunto de bibliotecas de software denominado 'bibliotecas estándar de ANSI C.
Posteriores versiones del estándar C han añadido algunos nuevos ficheros cabecera a la biblioteca:
<iso646.h>
, <wchar.h>
y <wctype.h>
fueron añadidas con Normativa Addendum 1 (abreviado NA1), y fueron ratificadas por el estándar en 1995.<complex.h>
, <fenv.h>
, <inttypes.h>
, <stdbool.h>
, <stdint.h>
y <tgmath.h>
. fueron añadidas en 1999 con la revisión C99 del estándar.El soporte de estas nuevas extensiones varía según implementaciones.
La biblioteca estándar de ANSI C consta de 24 ficheros cabecera que pueden ser incluidos en un proyecto de programación con una simple directiva. Cada cabecera contiene la declaración de una o más funciones, tipos de datos y macros.
En comparación con otros lenguajes de programación (como por ejemplo Java) la biblioteca estándar es muy pequeña, ésta proporciona un conjunto básico de funciones matemáticas, de tratamiento de cadenas, conversiones de tipo y entrada/salida por consola o por ficheros. No se incluyen, ni un conjunto de tipos de datos contenedores básicos (listas, pilas, colas, ...), ni herramientas para crear una interfaz gráfica de usuario (GUI), ni operaciones para trabajar en red, ni otras funcionalidades que lenguajes como C++ o Java incorporan de manera estándar. La principal ventaja del reducido tamaño de la biblioteca estándar de C es que construir un entorno de trabajo en ANSI C es muy fácil y, en consecuencia, portar un programa en ANSI C de una plataforma a otra es relativamente sencillo.
Se han desarrollado muchas otras bibliotecas para proporcionar una funcionalidad equivalente a la de otros lenguajes de programación. Por ejemplo, el proyecto de desarrollo del entorno de escritorio de GNOME creó las bibliotecas GTK+ y GLib con funcionalidades para desarrollar y trabajar con interfaces gráficas de usuario. La variedad de bibliotecas disponibles ha hecho que, a lo largo de la historia, haya quedado demostrada la superioridad de algunas de estas herramientas. El gran inconveniente es que a menudo no funcionan especialmente bien en conjunto, normalmente son los propios programadores familiarizados con las diferentes bibliotecas quienes consiguen sacarles el máximo partido, aunque diferentes partes de ellas puedan estar disponibles en cualquier plataforma.
<assert.h> | Contiene la macro assert (aserción), utilizada para detectar errores lógicos y otros tipos de fallos en la depuración de un programa. |
<complex.h> | Conjunto de funciones para manipular números complejos (nuevo en C99). |
<ctype.h> | Contiene funciones para clasificar caracteres según sus tipos o para convertir entre mayúsculas y minúsculas independientemente del conjunto de caracteres (típicamente ASCII o alguna de sus extensiones). |
<errno.h> | Para analizar los códigos de error devueltos por las funciones de biblioteca. |
<fenv.h> | Para controlar entornos en coma flotante (nuevo en C99). |
<float.h> | Contiene la definición de constantes que especifican ciertas propiedades de la biblioteca de coma flotante, como la diferencia mínima entre dos números en coma flotante (_EPSOLON), el número máximo de dígitos de precisión (_DIG), o el rango de valores que se pueden representar (_MIN, _MAX). |
<inttypes.h> | Para operaciones de conversión con precisión entre tipos enteros (nuevo en C99). |
<iso646.h> | Para utilizar los conjuntos de caracteres ISO 646 (nuevo en NA1). |
<limits.h> | Contiene la definición de constantes que especifican ciertas propiedades de los tipos enteros, como rango de valores que se pueden representar (_MIN, _MAX). |
<locale.h> | Para la función setlocale() y las constantes relacionadas. Se utiliza para seleccionar el entorno local apropiado (configuración regional).
|
<math.h> | Contiene las funciones matemáticas comunes. |
<setjmp.h> | Declara las macros setjmp y longjmp para proporcionar saltos de flujo de control de programa no locales.
|
<signal.h> | Para controlar algunas situaciones excepcionales como la división por cero. |
<stdarg.h> | Posibilita el acceso a una cantidad variable de argumentos pasados a una función. |
<stdbool.h> | Para el tipo booleano (nuevo en C99). |
<stdint.h> | Para definir varios tipos enteros (nuevo en C99). |
<stddef.h> | Para definir varios tipos de macros de utilidad. |
<stdio.h> | Proporciona el núcleo de las capacidades de entrada/salida del lenguaje C (incluye la venerable función printf ).
|
<stdlib.h> | Para realizar ciertas operaciones como conversión de tipos, generación de números pseudo-aleatorios, gestión de memoria dinámica, control de procesos, funciones de entorno, de señalización (??), de ordenación y búsqueda. |
<string.h> | Para manipulación de cadenas de caracteres. |
<tgmath.h> | Contiene funcionalidades matemáticas de tipo genérico (type-generic) (nuevo en C99). |
<time.h> | Para tratamiento y conversión entre formatos de fecha y hora. |
<wchar.h> | Para manipular flujos de datos anchos y varias clases de cadenas de caracteres anchos (2 o más bytes por carácter), necesario para soportar caracteres de diferentes idiomas (nuevo en NA1). |
<wctype.h> | Para clasificar caracteres anchos (nuevo en NA1). |
El lenguaje de programación C++ incluye la funcionalidad de la biblioteca estándar ANSI C, pero hace algunas modificaciones como cambiar los nombres de los ficheros de cabecera, de <xxx.h> a <cxxx> (aunque los nombres en estilo C, aun siendo obsoletos, siguen estando disponibles), y ubican todos los identificadores dentro del namespace std
.
Aunque no esté estandarizado, los programas en C pueden depender de una biblioteca de rutinas en tiempo de ejecución que contengan código que el compilador utiliza en tiempo de ejecución. El código que inicializa un proceso por el sistema operativo (por ejemplo, antes de llamar a main()
) está implementado en la biblioteca Run-Time (tiempo de ejecución) de C proporcionada por el distribuidor del compilador. El código de la biblioteca Run-Time podría ayudar con otras características de la implementación, como la manipulación de excepciones no capturadas o implementando código para operaciones en coma flotante.
La biblioteca estándar de C solo documenta que las rutinas mencionadas en el presente artículo están disponibles, así como su comportamiento. Ya que la implementación del compilador podría depender de la implementación de estas funciones para estar disponible, es probable que la especificación de las rutinas proporcionada por el fabricante esté empaquetada con la biblioteca estándar de C en el mismo módulo, ya que probablemente, ambas serán necesarias para cualquier programa construido con este compilador.
Aunque a menudo se confunda con la biblioteca estándar de C, debido a este empaquetamiento, la biblioteca Run-Time de C no es una parte normalizada del lenguaje, sino que es una especificación
Algunos compiladores (por ejemplo GCC[1]) proporcionan versiones incorporadas de muchas de las funciones de la biblioteca estándar de C; es decir, la implementación de las funciones está escrita dentro del fichero objeto compilado, y el programa llama a la versión incorporada en vez de, a la función del fichero objeto compartido en la biblioteca de C. Esto reduce el sobrecoste de una llamada a función, especialmente si las llamadas a función son remplazadas con variantes inline, y permiten otras formas de optimización (como cuando el compilados sabe las características de control de flujo de las variantes incorporadas), pero puede causar confusión al depurar (por ejemplo, las versiones incorporadas no pueden ser remplazadas por las variantes instrumentadas).
POSIX (y SUS) especifica una serie de rutinas que deben estar disponibles más allá de la propia biblioteca estándar de C. A menudo éstas se implementan conjuntamente con la biblioteca de C estándar, con distintos niveles de proximidad. Por ejemplo, glibc implementa funciones como fork()
dentro de libc.so, pero antes NPTL se fusionó con glibc constituyendo una biblioteca con su propia marca de linkado. A menudo, esta funcionalidad de POSIX se considera una parte de la biblioteca; la propia biblioteca de C puede ser identificada como la biblioteca ANSI C o ISO C.