Articulo de referencia

Biblioteca estándar de C

La biblioteca estándar de C , a veces denominada libc , [ 1 ] es la biblioteca estándar para el lenguaje de programación C , tal como se especifica en la norma ISO C. [ 2 ] Part...

La biblioteca estándar de C , a veces denominada libc , [ 1 ] es la biblioteca estándar para el lenguaje de programación C , tal como se especifica en la norma ISO C. [ 2 ] Partiendo de la norma ANSI C original , se desarrolló al mismo tiempo que la biblioteca C POSIX , que es un superconjunto de la misma. [ 3 ] Desde que ANSI C fue adoptada por la Organización Internacional de Normalización , [ 4 ] la biblioteca estándar de C también se denomina biblioteca ISO C. [ 5 ]

La biblioteca estándar de C proporciona macros , definiciones de tipos y funciones para tareas como manipulación de cadenas , cálculo matemático, procesamiento de entrada/salida, gestión de memoria y entrada/salida .

Interfaz de programación de aplicaciones (API)

Archivos de cabecera

La interfaz de programación de aplicaciones (API) de la biblioteca estándar de C se declara en varios archivos de cabecera . Cada archivo de cabecera contiene una o más declaraciones de funciones, definiciones de tipos de datos y macros.

Una implementación de una versión del estándar para el lenguaje C puede describirse como alojada o independiente . Una implementación alojada admite el estándar completo y requiere que estén presentes todos los archivos de cabecera especificados en el estándar; estas son implementaciones típicas para programas que se ejecutan en un sistema operativo. Una implementación independiente no requiere implementar características del lenguaje en la biblioteca C, salvo aquellas especificadas en esa versión del sistema operativo como necesarias para las implementaciones independientes; estas son implementaciones típicas para programas que se ejecutan en un sistema operativo muy limitado o directamente en el hardware.

Tras un largo período de estabilidad, se añadieron tres nuevos archivos de cabecera ( <iso646.h>, <wchar.h>, y ) con el Anexo Normativo 1 (NA1), una adición al estándar C ratificado en 1995. Se añadieron seis archivos de cabecera más ( , , , , , y ) con C99 , una revisión del estándar C publicada en 1999, cinco archivos más ( , , , , y ) con C11 en 2011 y dos archivos más ( y ) con C23 en 2023. En total, ahora hay 31 archivos de cabecera:<wctype.h><complex.h><fenv.h><inttypes.h><stdbool.h><stdint.h><tgmath.h><stdalign.h><stdatomic.h><stdnoreturn.h><threads.h><uchar.h><stdbit.h><stdckdint.h>

Leyenda:  : Obsoleto : Eliminado  

Tres de los archivos de cabecera ( <complex.h>, <stdatomic.h>, y <threads.h>) son características condicionales que las implementaciones no están obligadas a admitir.

El estándar POSIX añadió varios encabezados C no estándar para funcionalidades específicas de Unix. Muchos han encontrado su camino a otras arquitecturas. Algunos ejemplos son y . Otros grupos utilizan otros encabezados no estándar: la biblioteca C de GNU tiene , y OpenVMS tiene la función.<fcntl.h><unistd.h><alloca.h>va_count()

Documentación

En los sistemas tipo Unix, la documentación autorizada de la API se proporciona en forma de páginas man . En la mayoría de los sistemas, las páginas man sobre las funciones de la biblioteca estándar se encuentran en la sección  3; la sección  7 puede contener algunas páginas más genéricas sobre conceptos subyacentes (por ejemplo, man 7 math_erroren Linux ).

Implementaciones

Los sistemas tipo Unix suelen tener una biblioteca C compartida , pero los archivos de cabecera (y la cadena de herramientas del compilador) pueden estar ausentes en la instalación, por lo que el desarrollo en C puede resultar imposible. La biblioteca C se considera parte del sistema operativo en sistemas tipo Unix; además de las funciones especificadas por el estándar C, incluye otras funciones que forman parte de la API del sistema operativo, como las especificadas en el estándar POSIX . Las funciones de la biblioteca C, incluidas las del estándar ISO C, son ampliamente utilizadas por los programas y se consideran no solo una implementación de algo en el lenguaje C, sino también parte de facto de la interfaz del sistema operativo. Los sistemas operativos tipo Unix generalmente no pueden funcionar si se elimina la biblioteca C. Esto se aplica a las aplicaciones que se enlazan dinámicamente, en contraposición a las que se enlazan estáticamente. Además, el núcleo (al menos en el caso de Linux) funciona independientemente de cualquier biblioteca.

En Microsoft Windows, la biblioteca de tiempo de ejecución de C de Microsoft proporciona una implementación de la biblioteca estándar de C para el compilador Microsoft Visual C++ v6.0; la biblioteca estándar de C para versiones más recientes del  compilador Microsoft Visual C++ la proporciona cada compilador individualmente, así como los paquetes redistribuibles . Las aplicaciones compiladas escritas en C se enlazan estáticamente con una biblioteca de C o con una versión dinámica de la biblioteca que se distribuye con dichas aplicaciones, en lugar de depender de su presencia en los sistemas de destino. Las funciones de la biblioteca de C de un compilador no se consideran interfaces para Microsoft Windows; las interfaces del sistema Windows se proporcionan en bibliotecas independientes de la biblioteca de tiempo de ejecución de C.

Existen numerosas implementaciones de la biblioteca estándar de C, incluidas en diversos sistemas operativos y compiladores de C. Algunas de las implementaciones más populares son las siguientes:

  • La biblioteca BSD libc , varias implementaciones distribuidas con sistemas operativos derivados de BSD
  • Biblioteca C de GNU (glibc), utilizada en GNU Hurd , GNU/kFreeBSD y la mayoría de las distribuciones de Linux.
  • La biblioteca de tiempo de ejecución de Microsoft C, que forma parte de Microsoft Visual C++ . Existen dos versiones de la biblioteca: la MSVCRT, anteriormente redistribuible (hasta Visual Studio 2013), que no cumple con el estándar C99 , y la más reciente UCRT (Universal C Run Time), incluida en Windows 10 y 11, que sí cumple con el estándar C99..
  • dietlibc , una implementación pequeña alternativa de la biblioteca estándar de C (sin MMU).
  • μClibc , una biblioteca estándar de C para sistemas μClinux embebidos (sin MMU).
  • Newlib , una biblioteca estándar de C para sistemas embebidos (sin MMU) [ 6 ] y utilizada en la distribución GNU Cygwin para Windows.
  • klibc , principalmente para arrancar sistemas Linux
  • musl , otra implementación ligera de la biblioteca estándar de C para sistemas Linux [ 7 ]
  • Bionic , desarrollado originalmente por Google para el sistema operativo embebido Android, deriva de BSD libc.
  • picolibc , desarrollado por Keith Packard , está dirigido a pequeños sistemas embebidos con RAM limitada y se basa en código de Newlib y AVR Libc.
  • llvm-libc es una implementación desde cero de la biblioteca estándar de C, creada como parte del proyecto LLVM.

Funciones integradas del compilador

Algunos compiladores (por ejemplo, GCC [ 8 ] ) proporcionan versiones integradas de muchas de las funciones de la biblioteca estándar de C; es decir, las implementaciones de las funciones se escriben en el archivo objeto compilado , y el programa llama a las versiones integradas en lugar de a las funciones del archivo objeto compartido de la biblioteca de C. Esto reduce la sobrecarga de las llamadas a funciones, especialmente si estas se reemplazan por variantes en línea , y permite otras formas de optimización (ya que el compilador conoce las características de flujo de control de las variantes integradas), pero puede causar confusión durante la depuración (por ejemplo, las versiones integradas no se pueden reemplazar por variantes instrumentadas ).

Sin embargo, las funciones integradas deben comportarse como funciones ordinarias, de acuerdo con la norma ISO C. Esto implica que el programa debe poder crear un puntero a estas funciones a partir de su dirección e invocarlas mediante dicho puntero. Si se obtienen dos punteros a la misma función en dos unidades de traducción diferentes del programa, estos dos punteros deben ser iguales; es decir, la dirección se obtiene resolviendo el nombre de la función, que tiene un enlace externo (a nivel de programa).

Enlace, libm

Bajo FreeBSD [ 9 ] y glibc, [ 10 ] algunas funciones como sin()no se enlazan por defecto y en su lugar se agrupan en la biblioteca matemática libm . Si se utiliza alguna de ellas, se debe proporcionar al enlazador la directiva -lm. POSIX requiere que el compilador c99 admita -lm, y que las funciones declaradas en los encabezados <math.h>, <complex.h>, y <fenv.h>estén disponibles para enlazar si -lmse especifica, pero no especifica si las funciones se enlazan por defecto. [ 11 ] musl satisface este requisito al colocar todo en una única biblioteca libc y proporcionar una libm vacía. [ 12 ]

Detección

Según el estándar C, la macro __STDC_HOSTED__debe definirse como 1si la implementación está alojada. Una implementación alojada tiene todos los encabezados especificados por el estándar C. Una implementación también puede ser independiente, lo que significa que solo se garantiza la presencia de los encabezados necesarios para formar parte de una implementación independiente del estándar. Si una implementación es independiente , debe definirse __STDC_HOSTED__como 0.

Problemas y soluciones alternativas

Vulnerabilidades de desbordamiento de búfer

Algunas funciones de la biblioteca estándar de C han sido tristemente célebres por tener vulnerabilidades de desbordamiento de búfer y, en general, por fomentar la programación con errores desde su adopción. [ 13 ] [ a ] ​​Los elementos más criticados son:

Salvo en el caso extremo de gets(), todas las vulnerabilidades de seguridad pueden evitarse introduciendo código auxiliar para gestionar la memoria, comprobar los límites, verificar la entrada, etc. Esto se suele hacer mediante envoltorios que hacen que las funciones de la biblioteca estándar sean más seguras y fáciles de usar. Esta práctica se remonta al libro "The Practice of Programming" de B. Kernighan y R. Pike, donde los autores suelen usar envoltorios que imprimen mensajes de error y finalizan el programa si se produce un error.

El comité ISO C publicó los informes técnicos TR 24731-1 [ 14 ] y está trabajando en el TR 24731-2 [ 15 ] para proponer la adopción de algunas funciones con comprobación de límites y asignación automática de búfer, respectivamente. El primero ha recibido fuertes críticas, aunque también algunos elogios, [ 16 ] [ 17 ] y el segundo ha tenido una respuesta mixta.

A pesar de las preocupaciones, TR 24731-1 se integró en la línea de estándares C en ISO/IEC 9899:2011 (C11), Anexo K ( Interfaces de comprobación de límites ), y se implementó aproximadamente en la biblioteca de tiempo de ejecución C/++ (CRT) de Microsoft para las plataformas Win32 y Win64.

(Por defecto, los compiladores de C y C++ de Microsoft Visual Studio emiten advertencias al usar funciones antiguas e "inseguras". Sin embargo, la implementación de Microsoft de TR 24731-1 es sutilmente incompatible tanto con TR 24731-1 como con el Anexo K, [ 18 ] por lo que es común que los proyectos portátiles deshabiliten o ignoren estas advertencias. Se pueden deshabilitar directamente emitiendo

#pragma warning(disable : 4996)

antes/alrededor del/de los sitio(s) de llamada en cuestión, o indirectamente mediante la emisión de

#define _CRT_SECURE_NO_WARNINGS 1

antes de incluir cualquier encabezado. [ 19 ] La opción de línea de comandos /D_CRT_NO_SECURE_WARNINGS=1debería tener el mismo efecto que esta #define.)

Problemas de subprocesos, vulnerabilidad a condiciones de carrera.

La strerror()rutina es criticada por no ser segura para los hilos de ejecución y por ser vulnerable a condiciones de carrera .

Manejo de errores

El manejo de errores de las funciones en la biblioteca estándar de C no es consistente y a veces resulta confuso. Según la página del manual de Linux math_error, "La situación actual (versión 2.8) con glibc es caótica. La mayoría (pero no todas) las funciones generan excepciones en caso de error. Algunas también establecen errno . Unas pocas funciones establecen errno , pero no generan una excepción. Muy pocas funciones no hacen ninguna de las dos cosas." [ 20 ]

Normalización

El lenguaje C original no incluía funciones integradas, como operaciones de entrada/salida, a diferencia de lenguajes tradicionales como COBOL y Fortran . Con el tiempo, las comunidades de usuarios de C compartieron ideas e implementaciones de lo que hoy se conoce como bibliotecas estándar de C. Muchas de estas ideas se incorporaron posteriormente a la definición del lenguaje C estandarizado.

Tanto Unix como C fueron creados en los Laboratorios Bell de AT&T a finales de la década de 1960 y principios de la de 1970. Durante la década de 1970, el lenguaje C se popularizó rápidamente. Numerosas universidades y organizaciones comenzaron a crear sus propias variantes para sus proyectos. A principios de la década de 1980, surgieron problemas de compatibilidad entre las distintas implementaciones de C. En 1983, el Instituto Nacional Estadounidense de Estándares (ANSI) formó un comité para establecer una especificación estándar de C, conocida como " ANSI C ". Este trabajo culminó con la creación del estándar C89 en 1989. Parte de este estándar incluía un conjunto de bibliotecas de software denominadas biblioteca estándar ANSI C.

Bibliotecas del sistema que extienden la biblioteca C

Algunos sistemas operativos, como los sistemas tipo Unix , proporcionan una biblioteca del sistema que incluye tanto la biblioteca estándar de C como otras interfaces de programación específicas del sistema operativo.

Biblioteca estándar POSIX

POSIX y la Especificación Única de Unix especifican una serie de rutinas adicionales a las de la biblioteca estándar básica de C. La especificación POSIX incluye archivos de cabecera para, entre otras funcionalidades, hilos POSIX para programación multihilo , sockets Berkeley para redes y expresiones regulares . Estas se implementan a menudo junto con la funcionalidad de la biblioteca estándar de C, con distintos grados de similitud. Por ejemplo, glibc implementa funciones como forkdentro de libc.so, pero antes de que la Biblioteca de Hilos POSIX Nativos se fusionara con glibc, constituía una biblioteca separada con su propio argumento de bandera del enlazador. A menudo, esta funcionalidad especificada por POSIX se considerará parte de la biblioteca; la biblioteca básica de C puede identificarse como la biblioteca C ANSI o ISO .

BSD libc

BSD libc es un superconjunto de la biblioteca estándar POSIX compatible con las bibliotecas C incluidas en los sistemas operativos BSD , como FreeBSD , NetBSD , OpenBSD y macOS . BSD libc tiene algunas extensiones que no están definidas en el estándar original, muchas de las cuales aparecieron por primera vez en la versión 4.4BSD de 1994 (la primera en desarrollarse en gran medida después de que se publicara el primer estándar en 1989). Algunas de las extensiones de BSD libc son:

La biblioteca estándar de C en otros lenguajes

Algunos lenguajes incluyen la funcionalidad de la biblioteca estándar de C en sus propias bibliotecas. Si bien la biblioteca puede adaptarse para ajustarse mejor a la estructura del lenguaje, la semántica operacional se mantiene similar.

C++

El lenguaje C++ incorpora la mayoría de las construcciones de la biblioteca estándar de C en las suyas, excluyendo la maquinaria específica de C. Las funciones de la biblioteca estándar de C se exportan desde la biblioteca estándar de C++ de dos maneras.

Para la retrocompatibilidad/compatibilidad cruzada con C y C++ preestándar, se puede acceder a las funciones en el espacio de nombres global ( ::), después de #includeescribir el nombre del encabezado estándar de C como en C. [ 42 ]Sin embargo, el ::uso para indicar el espacio de nombres global es necesario solo cuando está dentro del ámbito de otros espacios de nombres donde se define el mismo nombre de símbolo. Por lo tanto, el programa C++98

#include <stdio.h>int main ( void ) { return puts ( "Hola, mundo!" ) == EOF ; }

debería presentar un comportamiento (aparentemente) idéntico al de un programa C95 con código idéntico .

Desde C++98 en adelante, las funciones de C también están disponibles en el espacio de nombres std(por ejemplo, C  printfcomo C++  std::printf, atoicomo std::atoi, feofcomo std::feof), al incluir el encabezado en lugar del encabezado C correspondiente . Por ejemplo, sustituye a y a ; tenga en cuenta la falta de extensión en los nombres de los encabezados de C++.<chdrname><hdrname.h><cstdio><stdio.h><cmath><math.h>.h

Por lo tanto, un programa equivalente (generalmente preferible) en C++≥98 a los dos anteriores es:

#include <cstdio>int main () { return std :: puts ( "Hola, mundo" ) == EOF ; }

Si se utiliza C++20 o posterior, se puede sustituir por (pero no por , ya que los módulos no exportan macros, como ).#include<cstdio>import<cstdio>;importstd;EOF

Se puede emitir una declaración arriba o dentro para calificar automáticamente el espacio de nombres (esencialmente aplicando el prefijo automáticamente), aunque escribir una instrucción puede contaminar el espacio de nombres global con símbolos potencialmente no deseados si se usa en el ámbito global de un encabezado . [ 43 ]usingnamespacestd;mainstdstd::using

Faltan algunos de los encabezados de las versiones C++≥98 de C; por ejemplo, C≥11 <stdnoreturn.h>y <threads.h>no tienen contrapartes en C++. [ 44 ]

Otros se reducen a marcadores de posición, como (hasta C++20 ) <ciso646>para C95 <iso646.h>, cuyas macros necesarias se representan como palabras clave en C++98. Las construcciones sintácticas específicas de C generalmente no son compatibles, incluso si su encabezado lo es. [ 45 ]

Existen varios encabezados de C principalmente para la compatibilidad con C++, y estos tienden a estar casi vacíos en C++. Por ejemplo, C9917<stdbool.h> solo requieren

#define bool _Bool #define false 0 #define true 1 #define __bool_true_false_are_defined 1

para simular compatibilidad con las palabras clave C++98 bool, falsey trueen C. C++11 requiere <stdbool.h>y <cstdbool>para compatibilidad, pero solo necesitan definir __bool_true_false_are_defined. C23 desaprueba _Boolla palabra clave anterior en favor de las nuevas palabras clave equivalentes a C++98 bool, falsey , por lo que los encabezados / de trueC≥23 y C++≥11 son totalmente equivalentes. (En particular, C23 no requiere ninguna macro para .)<stdbool.h>cstdbool>__STDC_VERSION_BOOL_H__<stdbool.h>

Se prefiere, siempre que sea posible, el acceso a las funciones de la biblioteca C a través del espacio de nombres ::std y los nombres de los encabezados C++≥98. Para fomentar su adopción, C++98 declara obsoletos los nombres de los encabezados C, por lo que es posible que el uso de encabezados de compatibilidad con C provoque que un preprocesador C++98–20 especialmente estricto genere algún tipo de diagnóstico. Sin embargo, C++23 (de forma inusual) vuelve a dejar obsoletos estos encabezados, por lo que las implementaciones/modos de C++ más recientes no deberían quejarse sin que se les solicite específicamente. [ 46 ]<*.h>

El módulostd.compat de la biblioteca estándar C++≥23 coloca todos los símbolos de la biblioteca estándar de C en el espacio de nombres global (similar a incluir todos <*.h>los encabezados), mientras que el stdmódulo deja los símbolos de la biblioteca estándar de C en el stdespacio de nombres (similar a incluir las versiones C++ de los encabezados de C). Otros lenguajes adoptan un enfoque similar, colocando las funciones/rutinas de compatibilidad con C bajo un espacio de nombres común; entre ellos se incluyen D , Perl y Ruby .

Pitón

CPython incluye envoltorios para algunas de las funciones de la biblioteca C en su propia biblioteca común, y también proporciona un acceso más directo a las funciones y variables de C a través de su paquete ctypes . [ 47 ]

De manera más general, Python  2.x especifica que los objetos de archivo integrados están “implementados usando el paquete stdio de C ”, [ 48 ] y se hace referencia frecuente a los comportamientos de la biblioteca estándar de C; las operaciones disponibles (open , read,writeSe espera que las funciones C correspondientes ( , , , etc.) tengan el mismo comportamiento que las funciones C correspondientes ( fopen, fread, fwrite, etc.).

Sin embargo, la especificación de Python 3 depende considerablemente menos de las particularidades de C que la de Python 2 .

Óxido

Rust ofrece una crate libcque permite utilizar diversas funciones y definiciones de tipos de la biblioteca estándar de C (y otras). [ 49 ]

Zig

Zig incluye libc para los objetivos disponibles. [ 50 ]

Comparación con las bibliotecas estándar de otros lenguajes

La biblioteca estándar de C es pequeña en comparación con las de otros lenguajes. Proporciona un conjunto básico de funciones matemáticas, manipulación de cadenas, conversiones de tipos y E/S basada en archivos y consola. No incluye un conjunto estándar de tipos de contenedores / colecciones como la Biblioteca de Plantillas Estándar de C++ , ni mucho menos los completos conjuntos de herramientas de interfaz gráfica de usuario (GUI), herramientas de red y la gran cantidad de funcionalidades que Java y .NET Framework ofrecen de forma estándar. La principal ventaja de esta pequeña biblioteca estándar es que crear un entorno ISO C funcional es mucho más sencillo que con otros lenguajes, y, por consiguiente, portar C a una nueva plataforma es relativamente fácil.

Véase también

Notas

  1. El gusano Morris que aprovecha la vulnerabilidad bien conocida engets()se ha creado ya en 1988.
  2. En la biblioteca estándar de C, el cálculo de la longitud de una cadena y la búsqueda del final de una cadena tienen complejidades de tiempo lineales y son ineficientes cuando se usan repetidamente en la misma cadena o en cadenas relacionadas.

Referencias

  1. Wellons, Chris (11 de febrero de 2023). "Mi reseña de la biblioteca estándar de C en la práctica" . Recuperado el 29 de diciembre de 2024 .
  2. ISO / IEC (2018). ISO/IEC 9899:2018(E): Lenguajes de programación - C §7
  3. "Diferencia entre la biblioteca estándar de C y la biblioteca POSIX de C" . stackoverflow.com . 2012. Consultado el 4 de marzo de 2015 .
  4. "Estándares C" . C: Estándares C. Keil . Consultado el 24 de noviembre de 2011 .
  5. "La biblioteca C de GNU – Introducción" . gnu.org . Consultado el 5 de diciembre de 2013 .
  6. "Re: ¿Newlib admite CPU sin MMU?" . Cygwin.com. 23 de marzo de 2006. Archivado del original el 22 de noviembre de 2008. Consultado el 28 de octubre de 2011 .
  7. "musl libc" . Etalabs.net . Consultado el 28 de octubre de 2011 .
  8. FSF (2024). "6.64 Otras funciones integradas proporcionadas por GCC" . Un manual de GNU . Publicado por el propio autor.
  9. "Compilación con cc" . Consultado el 2 de marzo de 2013 .
  10. Weimer, Florian. "c - ¿Para qué funciones está diseñada la biblioteca libm?" . Stack Overflow . Consultado el 24 de febrero de 2021 .
  11. "c99 - compilar programas C estándar" . The Open Group Base Specifications Issue 7, edición de 2018. The Open Group . Consultado el 24 de febrero de 2021 .
  12. "Preguntas frecuentes sobre musl" . www.musl-libc.org . Consultado el 24 de febrero de 2021 .
  13. Cobb, Michael (julio de 2021). "Buffer overflow" . TechTarget . Consultado el 29 de diciembre de 2024 .
  14. "ISO/IEC TR 24731-1: Extensiones a la biblioteca C, Parte I: Interfaces de comprobación de límites" (PDF) . open-std.org. 28 de marzo de 2007. Consultado el 13 de marzo de 2014 .
  15. "ISO/IEC WDTR 24731-2: Extensiones a la biblioteca C, Parte II: Funciones de asignación dinámica" (PDF) . open-std.org. 10 de agosto de 2008. Consultado el 13 de marzo de 2014 .
  16. ¿Utilizas las funciones 'seguras' de TR 24731 en tu código C? - Stack Overflow
  17. "Revisión del Grupo Austin de la norma ISO/IEC WDTR 24731" . Consultado el 28 de octubre de 2011 .
  18. "Experiencia práctica con el Anexo K: interfaces de verificación de límites " . Consultado el 9 de octubre de 2024 .
  19. "Funciones de seguridad en la CRT: Eliminación de advertencias de obsolescencia" . Febrero de 2023. Consultado el 9 de octubre de 2024 .
  20. "math_error - detección de errores en funciones matemáticas" . man7.org . 11 de agosto de 2008. Consultado el 13 de marzo de 2014 .
  21. "árbol" . Man.freebsd.org . 27 de diciembre de 2007. Consultado el 25 de agosto de 2013 .
  22. "Referencia cruzada de BSD para superusuarios: /OpenBSD/sys/sys/tree.h" . bxr.su .
  23. "cola" . Man.freebsd.org . 13 de mayo de 2011. Consultado el 25 de agosto de 2013 .
  24. "Referencia cruzada de BSD para superusuarios: /OpenBSD/sys/sys/queue.h" . bxr.su .
  25. "fgetln" . Man.freebsd.org . 19 de abril de 1994. Consultado el 25 de agosto de 2013 .
  26. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/stdio/fgetln.c" . bxr.su .
  27. "Referencia cruzada de BSD para superusuarios: /OpenBSD/include/stdio.h" . bxr.su .
  28. "fts" . Man.freebsd.org . 18 de marzo de 2012. Consultado el 25 de agosto de 2013 .
  29. "Referencia cruzada de BSD para superusuarios: /OpenBSD/include/fts.h" . bxr.su .
  30. "db" . Man.freebsd.org . 10 de septiembre de 2010. Consultado el 25 de agosto de 2013 .
  31. "Referencia cruzada de BSD para superusuarios: /OpenBSD/include/db.h" . bxr.su .
  32. Miller, Todd C. y Theo de Raadt. strlcpy y strlcat: copia y concatenación de cadenas consistentes y seguras . Actas de la Conferencia Técnica Anual de USENIX de 1999, del 6 al 11 de junio de 1999, págs. 175-178.
  33. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/string/strlcat.c" . bxr.su .
  34. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/string/strlcpy.c" . bxr.su .
  35. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/string/strncat.c" . bxr.su .
  36. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/string/strncpy.c" . bxr.su .
  37. "err" . Man.freebsd.org . 29 de marzo de 2012. Consultado el 25 de agosto de 2013 .
  38. "Referencia cruzada de BSD para superusuarios: /OpenBSD/include/err.h" . bxr.su .
  39. "vis(3)" . Man.FreeBSD.org . Consultado el 14 de septiembre de 2013 .
  40. "Referencia cruzada de BSD para superusuarios: /OpenBSD/lib/libc/gen/vis.c" . bxr.su .
  41. "Referencia cruzada de BSD para superusuarios: /OpenBSD/include/vis.h" . bxr.su .
  42. Encabezados de la biblioteca estándar de C++: encabezados de compatibilidad con C , consultado el 9 de octubre de 2024.
  43. Kieras, David (15 de febrero de 2015). "Using "using": Cómo usar el espacio de nombres std" (PDF) . Materiales de EECS381 . Departamento de EECS, Universidad de Michigan. Archivado (PDF) del original el 24 de diciembre de 2022. Recuperado el 9 de octubre de 2024. Una sola instrucción en un solo archivo de encabezado en un proyecto complejo puede causar un desastre en la gestión del espacio de nombres para todo el proyecto. Por lo tanto, ¡no se deben usar instrucciones de nivel superior [ ] en un archivo de encabezado!using namespace std;using namespace
  44. "Encabezados de la biblioteca estándar de C++: encabezados de C no compatibles" . Consultado el 9 de octubre de 2024 .
  45. "C++ Standard Library headers—Meaningless C headers" . Consultado el 9 de octubre de 2024 .
  46. "Encabezados de la biblioteca estándar de C++: encabezados de compatibilidad con C" . Consultado el 9 de octubre de 2024 .
  47. "ctypes: una biblioteca de funciones externas para Python" . docs.python.com . Consultado el 9 de octubre de 2024 .
  48. "La biblioteca estándar de Python, §5.9: Objetos de archivo" . Consultado el 9 de octubre de 2024. Los objetos de archivo se implementan utilizando el paquete stdio de C y se pueden crear con la función integrada .open()
  49. "Crate libc " . Rust Crates . Consultado el 9 de octubre de 2024 .
  50. "Descripción general ⚡ Lenguaje de programación Zig" . ziglang.org . Consultado el 3 de octubre de 2025 .

Lecturas adicionales

  • Plauger, PJ (1992). La biblioteca estándar de C (1.ª  ed.). Prentice Hall. ISBN 978-0131315099.
  • Guía de referencia de la biblioteca C
  • Lista útil de qué encabezados están en qué estándar
  • Rutinas de tiempo de ejecución de Microsoft Universal C por categoría en MSDN
  • Manual de las bibliotecas C de NetBSD. Archivado el 23 de diciembre de 2015 en Wayback Machine y código fuente completo de la biblioteca C.
  • Páginas del manual para las bibliotecas estándar C originales en Unix