La Red de Conocimientos Pedagógicos - Currículum vitae - 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 diferencias y conexiones entre la biblioteca en tiempo de ejecución de C, la biblioteca estándar de C y la API de Windows

Funciones de la biblioteca en tiempo de ejecución de C

Las funciones de la biblioteca en tiempo de ejecución de C se refieren a algunas funciones básicas admitidas por el propio lenguaje C, que generalmente se implementan directamente en ensamblador.

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 como funciones en el lenguaje C.

Diferencia

La diferencia entre ellos es: las funciones API son para el sistema operativo, mientras que las funciones de tiempo de ejecución del lenguaje C son para el lenguaje C mismo.

·1. La biblioteca en tiempo de ejecución es la biblioteca en tiempo de ejecución de C, que es un concepto en el mundo del lenguaje C en lugar de C++.

Se elige este nombre porque su programa C necesita las funciones de estas bibliotecas cuando se ejecuta.

·2. El lenguaje C es el llamado lenguaje de "núcleo pequeño", que es muy pequeño en términos del lenguaje en sí (pocas palabras clave, control de flujo de programa, tipos de datos, etc.);

Por lo tanto, después de que se desarrolló el núcleo del lenguaje C, Dennis Ritchie y Brian Kernighan reescribieron más del 90% de las funciones del sistema UNIX en el propio C

y aislaron las partes más utilizadas para formar los Archivos de encabezado y la BIBLIOTECA correspondiente, la Biblioteca en tiempo de ejecución de C se forma de esta manera

.

·3. Posteriormente, con la popularidad del lenguaje C, varios fabricantes/individuos/grupos de compiladores de C siguieron la antigua tradición y tuvieron versiones correspondientes en diferentes plataformas

Biblioteca estándar, pero la mayoría de las implementaciones están relacionadas con cada plataforma. Dado que varios compiladores de C tienen muchas diferencias y diferencias sutiles en su soporte y comprensión de C, se crea ANSI C (intencionado subjetivamente) que estipula en detalle los elementos específicos del lenguaje C

. requisitos de implementación, se introduce un nuevo método de declaración de funciones y se establece la forma estándar de la Biblioteca estándar. Por lo tanto, las bibliotecas de tiempo de ejecución de C

las proporciona el fabricante del compilador. En cuanto a los archivos de encabezado y funciones de biblioteca proporcionadas por otros fabricantes/individuos/grupos, deben denominarse bibliotecas de tiempo de ejecución de C de terceros

(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 procesamiento de división por cero). El programa que escriba

no necesita la biblioteca matemática y el programa aún se ejecutará, pero no puede manejar operaciones matemáticas complejas. Sin embargo, si no hay una biblioteca de tiempo de ejecución de C, main()

. p>

no será llamado y no se podrá responder a exit(). Porque la biblioteca en 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 de C++, existe otro concepto: Biblioteca C++ estándar, que incluye la Biblioteca de tiempo de ejecución de C

y STL mencionadas anteriormente. La razón para incluir la biblioteca en tiempo de ejecución de C es obvia. C++ es un superconjunto de C. No hay ninguna razón para crear una nueva biblioteca en tiempo de ejecución de C++. La biblioteca estándar de C++ agregada por VC para C++ incluye principalmente: LIBCP.LIB, LIBCPMT.LIB y MSVCPRT.LIB.

·6. En el entorno Windows, la biblioteca de tiempo de ejecución C proporcionada por VC se divide en biblioteca de tiempo de ejecución dinámica y biblioteca de tiempo de ejecución estática.

Biblioteca de tiempo de ejecución dinámica

La biblioteca de tiempo de ejecución dinámica incluye principalmente:

·Archivo de biblioteca DLL: msvcrt.dll (o MSVCRTD.DLL para compilación de depuración)

·Archivo de biblioteca de importación correspondiente: MSVCRT.LIB (o MSVCRTD.LIB para compilación de depuración)

Biblioteca de tiempo de ejecución estática

Biblioteca de tiempo de ejecución estática (versión de lanzamiento)) correspondiente al Los archivos principales incluyen:

·LIBC.LIB (Biblioteca estática de un solo subproceso, versión comercial)

·LIBCMT.LIB (Biblioteca estática multiproceso, versión comercial)

msvcrt.dll proporciona miles de funciones C, incluso funciones de bajo nivel como printf están todas en msvcrt.dll. De hecho, cuando su programa se está ejecutando, gran parte del tiempo se ejecuta en estas bibliotecas de tiempo de ejecución. Cuando se compila su programa (versión de lanzamiento), VC convertirá automáticamente el archivo de biblioteca de tiempo de ejecución correspondiente (libc.lib, libcmt.lib o Import Library msvcrt.lib de acuerdo con sus opciones de compilación (un solo subproceso, múltiples subprocesos o DLL). enlace en.

2. El papel de la biblioteca en tiempo de ejecución de C

Además de proporcionarnos las llamadas a funciones de biblioteca necesarias (como memcpy, printf, malloc, etc.), la biblioteca en tiempo de ejecución de C proporciona Otra característica más importante es agregar una función 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 de un programa de consola que no utiliza un conjunto de caracteres amplio 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 completa de la versión de WIN32*/

_osver = GetVersion();

_winminor = (_osver >> 8) & 0x00FF ;

 _winmajor = _osver & 0x00FF;

 _winver = (_winmajor << 8) + _winminor;

 _osver = (_osver >> 16) & 0x00FFFF; p>

 _ioinit(); /* inicializar lowio */

 /* Obtener información de la línea de comando*/

 _acmdln = (char *) GetCommandLineA();

/* Obtener información del entorno*/

_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*/

salir( mainret)

}

Como se puede ver en el código anterior, la biblioteca en tiempo de ejecución realiza algún trabajo de inicialización antes de llamar a la función principal o WinMain del programa de usuario. Una vez completada la inicialización, se llama a la función principal o WinMain que escribimos. Solo de esta manera nuestra biblioteca y aplicaciones en tiempo de ejecución del lenguaje C podrán funcionar normalmente.

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 para proporcionar funciones de inicialización. wcrt0.c es la versión con juego de caracteres amplio de crt0.c, wincrt0.c contiene la función de entrada para aplicaciones de Windows y wwincrt0.c es la versión con juego 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 su código fuente, debe reinstalar Visual C++ y seleccionar la opción para instalar el código fuente del tiempo de ejecución al reinstalar.

Veamos 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");

TRY

{

file.Open("file.dat",CFile::modeWrite | CFile::modeCreate);

}

CATCH( CFileException, e )

 {

#ifdef _DEBUG

afxDump << "No se pudo abrir el archivo " << e->m_cause << "\n";

#endif

}

END_CATCH

file.Write(str,str.GetLength());

file.Close();

}

Se produjo un error de enlace cuando "reconstruimos 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< / p>

Error al ejecutar cl.exe.

El motivo del error es que Visual C++ utiliza una biblioteca de vínculos estáticos de un solo subproceso para programas de consola de forma predeterminada y la clase CFile en MFC tiene archivos múltiples ocultos. -enhebrado. Solo necesitamos hacer clic en Proyecto->Configuración->menú y opciones de C/C++ en Visual C++6.0, y modificar las opciones de compilación en Opciones del proyecto.

La relación entre la biblioteca en tiempo de ejecución de C y la biblioteca estándar de C

La biblioteca estándar de C, como su nombre lo indica, es un estándar y está formulada por una organización de estándares. Es un estándar desarrollado por el "Instituto Nacional Estadounidense de Estándares (ANSI)" para regular la biblioteca del lenguaje C. Al principio, las bibliotecas de lenguaje C utilizadas por varias universidades y empresas eran diferentes, lo que dificultaba mucho el trasplante mutuo. En este contexto, se formuló este estándar.

La biblioteca en tiempo de ejecución de C está relacionada con la plataforma, es decir, con el sistema operativo. Proporciona diferentes bibliotecas de tiempo de ejecución de C para diferentes sistemas operativos y diferentes plataformas de desarrollo. Sin embargo, parte de la implementación de la biblioteca en tiempo de ejecución de C se basa en la biblioteca estándar de C. Es decir, la biblioteca en tiempo de ejecución de C es una biblioteca desarrollada por cada sistema operativo y cada herramienta de desarrollo de acuerdo con su propia plataforma. Se puede decir que la biblioteca en 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 relacionadas o irrelevantes con la plataforma que no están disponibles en la biblioteca estándar de C. Por ejemplo: la función strcpy de la biblioteca estándar de C es responsable de copiar cadenas, pero debido a la falta de control sobre el tamaño del búfer de la cadena de destino, es muy probable que cause un desbordamiento del búfer (una gran cantidad de ataques de desbordamiento del búfer se deben a esta vulnerabilidad) generado); por el contrario, Windows proporciona una función de copia de cadena segura que puede lograr la misma función, reduciendo la posibilidad de ataques de búfer, strcpy_s.

Estas funciones se proporcionan en forma de biblioteca en tiempo de ejecución de C. Por supuesto, la biblioteca en tiempo de ejecución de C puede ser diferente en diferentes sistemas operativos, pero el soporte para la biblioteca estándar de C es completamente consistente en diferentes sistemas operativos. utilizar Las funciones de la misma biblioteca estándar de C deben producir resultados consistentes.

La biblioteca estándar de C proporciona:

l entrada y salida estándar (stdio.h).

l Operaciones con archivos (stdio.h).

l Operaciones de caracteres (ctype.h).

l Operaciones de cadena (cadena.h).

l Funciones matemáticas (math.h).

l Gestión de recursos (stdlib.h).

l conversión de formato (stdlib.h).

l Hora/Fecha (hora.h).

l Aserción (assert.h).

l Constantes de varios tipos (limits.h y float.h).

El programa que escriba no necesita la biblioteca matemática. El programa aún se ejecutará, pero no podrá manejar operaciones matemáticas complejas. Sin embargo, si no hay una biblioteca de tiempo de ejecución de C, main(. ) no será llamado, exit() Tampoco se puede responder. Porque la biblioteca en tiempo de ejecución de C contiene las funciones más básicas y comúnmente utilizadas para ejecutar programas en C.

La siguiente es la relación entre la biblioteca en tiempo de ejecución de C y la biblioteca estándar de C:

Una biblioteca en tiempo de ejecución de C incluye aproximadamente las siguientes funciones:

l Inicio y salida : incluidas funciones de entrada y otras funciones de las que depende la función de entrada, etc.

l Función estándar: implementación de función propiedad de la biblioteca estándar del lenguaje C especificada por el estándar del lenguaje C. (Biblioteca estándar C)

l E/S: encapsulación e implementación de 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 implementació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, la biblioteca CRT en tiempo de ejecución de C y la biblioteca estándar de C

En primer lugar, el lenguaje C apareció antes que Windows y la formulación estándar real El lenguaje C también comenzó más tarde que el tiempo de desarrollo del sistema Windows (donde apareció el concepto API). Por lo tanto, los sistemas Windows pueden utilizar completamente el lenguaje C durante el desarrollo. En la actualidad, la mayoría de las declaraciones se implementan en C y ensamblador. Entonces, siempre que use C, puede usar la biblioteca estándar de C.

Asumimos dos situaciones. Una es que la implementación de la API de Windows incluye la implementación funcional de algunas funciones de la biblioteca estándar de C, lo que determina que la implementación de esta parte de la API del sistema operativo se implementa llamando al estándar. biblioteca Luego, al publicar, debe agregar la DLL de la biblioteca estándar de C utilizada y publicarla en conjunto.

En segundo lugar, el desarrollo del kernel de Microsoft (incluida la API) utiliza una biblioteca de enlaces estáticos en lenguaje C que está estrictamente relacionada con la plataforma, por lo que se puede desarrollar y distribuir sin proporcionar una Dll. Y es inevitable que esta biblioteca C se implemente en base a ensamblador, lo que significa que las funciones C en esta biblioteca son (al menos en una gran proporción) código ensamblador cubierto en sintaxis C.

Si fueras Microsoft, ¿cuál elegirías? Quizás sean ambas cosas, quizás sea lo último.

En términos generales, lo que queremos decir con biblioteca de tiempo de ejecución de C es la biblioteca de tiempo de ejecución de C para qué plataforma y plataforma de desarrollo.

La implementación de CRT se basa en la API de Windows y el desarrollo de WindowsAPI. también se basa en el lenguaje C, pero no se basa necesariamente en CRT (o biblioteca estándar de C).

Indo un paso más allá, aunque CRT se implementa en base a la API del sistema operativo, no significa que todo CRT encapsule la API del sistema operativo. Por ejemplo, algún control de permisos de usuario, creación de subprocesos del sistema operativo, etc. . no pertenecen a la biblioteca C Runtime, por lo que para estas operaciones tenemos que llamar directamente a la API del sistema operativo u otras bibliotecas.

En resumen, la biblioteca estándar de C es la biblioteca básica del lenguaje C que se puede utilizar en cualquier plataforma. Además de agregar la biblioteca estándar C a su alcance, CRT también amplía la biblioteca de interfaces relacionadas con la plataforma. Estas interfaces implementan llamadas API del sistema operativo de diferentes plataformas según las diferentes plataformas.

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 que las aplicaciones escritas con CRT, otras funciones de la biblioteca relacionadas con la plataforma no se pueden ejecutar en todas las plataformas.