Las diferencias y conexiones entre la biblioteca en tiempo de ejecución de C, la biblioteca estándar de C y la API de Windows
Las funciones de la biblioteca en tiempo de ejecución de C son algunas funciones básicas admitidas por el propio lenguaje C y, por lo general, el ensamblador las implementa directamente.
Funciones API
Las funciones API son funciones proporcionadas por el sistema operativo para implementar funciones específicas para facilitar a los usuarios el diseño de aplicaciones. Las funciones API también se implementan mediante funciones de lenguaje C.
Diferencia
La diferencia entre ellos es que las funciones API son específicas del sistema operativo, mientras que las funciones de tiempo de ejecución de C son específicas del lenguaje C mismo.
-1. La biblioteca en tiempo de ejecución es una biblioteca en tiempo de ejecución C. Este es un concepto en el mundo del lenguaje C, no un concepto en el lenguaje C.
Se llama así porque necesitas las funciones de estas bibliotecas para ejecutar programas en C.
2. C es el llamado lenguaje de "núcleo pequeño". En lo que respecta al lenguaje en sí, es muy pequeño (muy pocas palabras clave, control de flujo de programa, tipos de datos, etc.);
Por lo tanto, después de desarrollar el núcleo C, Dennis Ritchie y Brian Kernighan hicieron del propio C el lenguaje de elección. Kernighan reescribió más de 90 funciones del sistema UNIX en lenguaje C y separó las partes más utilizadas en archivos de encabezado y la BIBLIOTECA correspondiente. Este es el proceso de formación de la biblioteca en tiempo de ejecución.
-3 Posteriormente, con la popularidad del lenguaje C, varios fabricantes/individuos/grupos de compiladores de C siguieron la antigua tradición y tenían los estándares
correspondientes en las bibliotecas de diferentes plataformas, pero la mayoría de las implementaciones. son específicos de la plataforma. Debido a que existen muchas diferencias y matices en el soporte y la comprensión del lenguaje C por parte de los compiladores del lenguaje C
ANSI C nació; ANSI C (subjetivamente) especifica el significado de cada elemento del lenguaje C en detalle
p> >Y los requisitos para la implementación del compilador, se introdujo un nuevo método de declaración de funciones y se estableció una forma estandarizada de la biblioteca estándar. Por lo tanto, las bibliotecas de tiempo de ejecución de C las proporciona el fabricante del compilador. Los archivos de encabezado y las funciones de biblioteca proporcionadas por otros proveedores/individuos/grupos se denominarán bibliotecas de tiempo de ejecución de C de terceros.
-4. La biblioteca de tiempo de ejecución de C contiene código de inicialización y código de manejo de errores (como el manejo de división por cero). Puedes escribir un programa sin una biblioteca matemática
y funcionará bien, simplemente no podrá manejar problemas matemáticos complejos, pero sin la biblioteca de tiempo de ejecución de C main()
no será llamado y exit() no responderá. Esto se debe a que la biblioteca de tiempo de ejecución de C contiene las funciones más básicas y comúnmente utilizadas para ejecutar programas en C.
-5. En el mundo C, existe otro concepto: la biblioteca C estándar, que incluye la biblioteca en tiempo de ejecución de C
y STL, que incluye la biblioteca en tiempo de ejecución de C por razones obvias. , es decir, C es un superconjunto de C, por lo que no hay razón para crear una nueva biblioteca de tiempo de ejecución de C.
Biblioteca. Las bibliotecas C estándar agregadas por VC para C incluyen LIBCP.LIB, LIBCPMT.LIB y MSVCPRT.LIB.
-6. La biblioteca de tiempo de ejecución C proporcionada por VC para Windows se divide en biblioteca de tiempo de ejecución dinámica
y STL. Las bibliotecas se dividen en bibliotecas de tiempo de ejecución dinámicas y bibliotecas de tiempo de ejecución estáticas.
Biblioteca de tiempo de ejecución dinámica
Incluye principalmente:
-Archivo de biblioteca DLL: msvcrt.dll (o MSVCRTD.DLL para la compilación de depuración)
-Archivo de biblioteca de importación correspondiente: MSVCRT.LIBCMT.LIB (biblioteca estática multiproceso, versión comercial)
msvcrt.dll proporciona miles de funciones en lenguaje C, incluso funciones como printf Las funciones de bajo nivel también están en msvcrt.dll. De hecho, la mayor parte del tiempo de ejecución del programa se pasa en estas bibliotecas de ejecución. Al compilar un programa (versión de lanzamiento), VC vinculará automáticamente el archivo de biblioteca de tiempo de ejecución correspondiente (libc.lib, libcmt.lib o la biblioteca de importación msvcrt.lib) de acuerdo con la opción de compilación (de un solo subproceso, de varios subprocesos o DLL). .
2. El papel de la biblioteca en tiempo de ejecución de C
Además de proporcionarnos las llamadas a la biblioteca necesarias (como memcpy, printf, malloc, etc.), la biblioteca en tiempo de ejecución de C proporciona Otra función más importante. La característica importante es agregar funcionalidad de inicio a la aplicación.
Las funciones principales de la función de inicio de la biblioteca en tiempo de ejecución de C son inicializar el programa, asignar valores iniciales a las variables globales y cargar la función de entrada del programa de usuario.
El punto de entrada para los programas de consola que no utilizan conjuntos de caracteres anchos es mainCRTStartup(void). Tomemos esta función como ejemplo para analizar qué tipo de programa de entrada nos agrega la biblioteca en tiempo de ejecución. Esta función está definida en crt0.c. El siguiente código ha sido organizado y simplificado por el autor:
void mainCRTStartup(void)
{
int mainret
/ *Obtener información de la versión completa de WIN32*
_osver = GetVersion();
_winminor = (_osver gt; 8) amp
_winmajor = _osver amp; ; 0x00FF;
_winver = (_winmajor lt; lt; 8) _winminor;
_osver = (_osver gt; lt; 16) amp; _ioinit() /* Inicializar lowio */
/* GetCommandLineInfo */
_acmdln = (char *) GetCommandLineA()
/* Obtener entorno información*/
_aenvptr = (char *) __crtGetEnvironmentStringsA();
_setargv() /* Establecer parámetros de línea de comando*/
_ setenvp(); ; /* Establecer parámetros de entorno */
_cinit(); /* Inicialización de datos C: inicialización de variable global, ¡aquí mismo! */
__initenv = _environ;
mainret = main( __argc, __argv, _environ); /* Llamar a la función principal */
exit( mainret ) ;
}
Como se puede ver en el código anterior, la biblioteca realizará alguna inicialización antes de llamar a la función principal o WinMain del programa de usuario. Una vez completada la inicialización, se llamará a la función principal o WinMain que escribimos.
Sólo así nuestras bibliotecas y aplicaciones en tiempo de ejecución de C podrán funcionar correctamente.
Además de crt0.c, la biblioteca de tiempo de ejecución de C también contiene tres archivos, wcrt0.c, wincrt0.c y wwincrt0.c, que proporcionan funcionalidad de inicialización. wcrt0.c es la versión con conjunto de caracteres amplio de crt0.c. wincrt0.c contiene las funciones de punto de entrada para aplicaciones de Windows y wwincrt0.c es la versión de conjunto de caracteres amplio de wincrt0.c.
El código fuente de la biblioteca en tiempo de ejecución de Visual C no está instalado de forma predeterminada. Si desea ver el código fuente, deberá reinstalar Visual C y marcar la opción Instalar el código fuente de la biblioteca en tiempo de ejecución al reinstalar.
Aquí hay un programa de consola que no utiliza correctamente la biblioteca de tiempo de ejecución de C:
#include
#include
int main( )
{
Archivo CFile
CString str("Te amo");
TRYP
TRY
{
file.Open("file.dat", CFile::modeWrite | CFile::Write(str, str.GetLength());
file.Close();
}
Recibimos un error de enlace en "reconstruir todo":
nafxcwd.lib(thrdcore.obj) : error LNK2001: símbolo externo sin resolver __endthreadex
nafxcwd.lib(thrdcore.obj): error LNK2001: símbolo externo sin resolver __beginthreadex
main.exe: error fatal LNK1120: 2 externos sin resolver
Error al ejecutar cl.exe. El motivo del error es que Visual C utiliza una biblioteca estática de un solo subproceso para los programas de consola de forma predeterminada, y la clase CFile en MFC ya implica subprocesos múltiples. use Visual C 6.0 Haga clic en Proyecto-gt; menú y opciones de C/C para cambiar las opciones de compilación en Opciones del proyecto
La relación entre la biblioteca de tiempo de ejecución de C y la biblioteca estándar de C<.p>La biblioteca estándar C, como su nombre lo indica, es un estándar desarrollado por una organización de estándares. Es un estándar desarrollado por el Instituto Nacional Estadounidense de Estándares (ANSI) y tiene como objetivo estandarizar la biblioteca C. La razón es que las universidades y las bibliotecas de lenguaje C utilizadas por las empresas son diferentes, por lo que es difícil portarlas entre sí.
El tiempo de ejecución del lenguaje C depende de la plataforma, es decir, está relacionado con el funcionamiento. sistema Proporciona diferentes plataformas de desarrollo a través de diferentes sistemas operativos. Biblioteca de tiempo de ejecución de C. Pero parte de la implementación de la biblioteca de tiempo de ejecución de C se basa en la biblioteca estándar de C. sistemas y diversas herramientas de desarrollo según sus propias plataformas. Hasta cierto punto, se puede decir que la biblioteca de tiempo de ejecución de C es una biblioteca de extensión de la biblioteca estándar de C. Solo agrega muchas funciones de interfaz de biblioteca irrelevantes o independientes de la plataforma a C. biblioteca estándar.
Por ejemplo, la función strcpy en la biblioteca estándar de C es responsable de la copia de cadenas, pero debido a la falta de control sobre el tamaño del búfer de la cadena de destino, puede provocar fácilmente un desbordamiento del búfer (una gran cantidad de ataques de desbordamiento del búfer son causados por esto tipo de vulnerabilidad); en cambio, Windows proporciona una función de copia de cadena segura, strcpy_s, que logra la misma funcionalidad y reduce la posibilidad de ataques al búfer. Estas funciones se proporcionan como una biblioteca de tiempo de ejecución de C. Por supuesto, la biblioteca de tiempo de ejecución de C puede diferir entre sistemas operativos, pero el soporte para la biblioteca estándar de C es el mismo, lo que significa que usar las mismas funciones de la biblioteca estándar de C en diferentes sistemas operativos seguramente producirá resultados consistentes.
La biblioteca estándar de C proporciona:
l entrada y salida estándar (stdio.h).
l Operaciones con archivos (stdio.h).
lOperaciones de caracteres (ctype.h).
lOperaciones de cadena (cadena.h).
l Funciones matemáticas (math.h).
l Gestión de recursos (stdlib.h).
Conversión de formato (stdlib.h).
lHora/Fecha (hora.h).
l Afirmaciones (assert.h).
l Varios tipos de constantes (limits.h & float.h).
Puedes escribir un programa sin usar una biblioteca matemática y el programa se ejecutará bien, simplemente no manejará operaciones matemáticas complejas, pero sin usar la biblioteca de tiempo de ejecución de C, no se llamará a main(). exit() no será respondido. Esto se debe a que la biblioteca de tiempo de ejecución de C contiene las funciones más básicas y comúnmente utilizadas para ejecutar programas en C.
La relación entre la biblioteca en tiempo de ejecución de C y la biblioteca estándar de C es la siguiente:
La biblioteca en tiempo de ejecución de C contiene aproximadamente las siguientes funciones:
l Inicio y salida: incluye la función de entrada y otras funciones de las que depende la función de entrada.
l Funciones estándar: implementaciones de funciones propiedad de la biblioteca estándar de C especificada por el estándar C. (Biblioteca estándar C)
l E/S: para encapsular e implementar funciones de E/S, consulte la sección de inicialización de E/S en la sección anterior.
l Montón: para la encapsulación e implementación del montón, consulte la sección de inicialización del montón en la sección anterior.
l Implementación del lenguaje: la realización de algunas funciones especiales en el lenguaje.
l Depuración: código que implementa funciones de depuración.
La diferencia entre la API del sistema operativo y la biblioteca de tiempo de ejecución CRT y la biblioteca estándar C
En primer lugar, el nacimiento del lenguaje C es anterior al de Windows y la estandarización real del lenguaje C. También comenzó antes que el desarrollo del sistema Windows (el concepto de API aparece en los sistemas Windows). Por tanto, los sistemas Windows se desarrollan teniendo en mente el lenguaje C. La teoría más popular actualmente es que se implementa en lenguaje C y ensamblador. Luego, siempre que utilice C, será posible utilizar la biblioteca estándar de C.
Asumimos que hay dos situaciones. Una es que la implementación de la API de Windows incluye algunas implementaciones funcionales de las funciones de la biblioteca estándar de C, lo que determina que se logra la implementación de esta parte de la API del sistema operativo. llamando a la biblioteca estándar. , luego debe agregar la DLL de la biblioteca estándar c utilizada al publicar.
En segundo lugar, el desarrollo del kernel de Microsoft (incluida la API) utiliza una biblioteca C estática que es estrictamente específica de la plataforma, por lo que no es necesario proporcionar una Dll para el desarrollo y el lanzamiento. Además, esta biblioteca C se implementa necesariamente en ensamblador, lo que significa que las funciones C en la biblioteca (al menos una gran parte) son código ensamblador oculto en la sintaxis de C.
Si fueras Microsoft, ¿cuál elegirías? Puede elegir ambos o puede elegir el último.
En términos generales, cuando decimos biblioteca en tiempo de ejecución de C, implícitamente nos referimos a la biblioteca en tiempo de ejecución de C para qué plataforma y qué plataforma de desarrollo.
La implementación de CRT se basa en la API de Windows, y el desarrollo de la API de Windows se basa en el lenguaje C, pero no se basa o no necesariamente en el CRT (o la biblioteca estándar C).
Para decirlo más profundamente, aunque CRT se implementa en función de las API del sistema operativo, eso no significa que todas las API del sistema operativo encapsuladas por CRT, como ciertos controles de permisos de usuario, creación de subprocesos del sistema operativo, etc. Pertenece a la biblioteca de tiempo de ejecución de C, por lo que debemos llamar directamente a las API del sistema operativo u otras bibliotecas para realizar estas operaciones.
En resumen, la biblioteca estándar de C es la biblioteca de C básica que se puede utilizar en cualquier plataforma.
Como se muestra en la figura siguiente, los programas escritos con la biblioteca estándar C se pueden aplicar a la plataforma Windows o a la plataforma Linux mientras se utilizan otras bibliotecas CRT relacionadas con la plataforma, aplicaciones escritas con la biblioteca estándar C; no se puede ejecutar multiplataforma.