2009-01-12 15 views
9

Muchas de las funciones estándar de la biblioteca c (fwrite, memset, malloc) tienen equivalentes directos en la API de Windows (WriteFile, FillMemory/ZeroMemory, GlobalAlloc).C library vs WinApi

Además de los problemas de portabilidad, ¿qué se debe usar, las funciones CLIB o Windows API?

¿Llamarán las funciones C a las funciones de winapi o es al revés?

gracias por la ayuda

Respuesta

15

No hay nada mágico sobre la biblioteca C. Es solo una API estandarizada para acceder a servicios comunes desde el sistema operativo. Eso significa que está implementado sobre el sistema operativo, utilizando las API proporcionadas por el sistema operativo.

Utilice el que tenga sentido en su situación. La biblioteca C es portátil, Win32 no lo es. Por otro lado, Win32 suele ser más flexible y expone más funciones.

3

Las funciones no son realmente equivalentes a excepción de algunas cosas simples como ZeroMemory.

GlobalAlloc, por ejemplo, le da memoria, pero también se utilizó para la transferencia de memoria compartida en win16. Partes de esta funcionalidad todavía existen.

WriteFile no solo escribirá en los archivos sino también en (entre otros) conductos con nombre. Algo que escribir o escribir no puede hacer directamente.

Diría que use las funciones de la biblioteca c si es posible y use las funciones de Windows solo si necesita la funcionalidad adicional o si obtiene una mejora en el rendimiento.

Esto facilitará la transferencia a otras plataformas más adelante.

1

Las funciones C llamarán a la API del sistema, la biblioteca Standard Runtime C (o CRT) es una API utilizada para estandarizar entre los sistemas.

Internamente, cada sistema diseña su propia API directamente mediante llamadas al sistema o controladores. Si tiene una versión comercial de Visual C++, solía proporcionar el código fuente de CRT, esta es una lectura interesante.

2

¿Llamarán las funciones C a las funciones de winapi o es al revés?

Las funciones C (que se implementan en una biblioteca en modo de usuario) llaman a las funciones WINAPI (que se implementan en el kernel O/S).

+0

Muchas funciones de Winapi se implementan en las DLL de sistema operativo, que causan que las llamadas al sistema sean realmente implementadas y no documentadas. – Blaisorblade

+0

Algunas de las llamadas (por ejemplo, E/S de archivo, donde el controlador del sistema de archivos está en el núcleo) obviamente deben terminar en el kernel de O/S; mientras que otros (por ejemplo, simplemente poniendo a cero un rango de memoria de modo de usuario) no necesitan. – ChrisW

1

Unos pocos puntos adicionales en algunos ejemplos:

FillMemory, ZeroMemory

ni estos ni las funciones C son llamadas al sistema, por lo que cualquiera de los dos podría implementarse en la parte superior de la otra, o incluso podrían tener implementaciones diferentes, provenientes de una fuente común o no.

GlobalAlloc

Desde malloc() se construye en la parte superior de primitivas del sistema operativo expuestos por su API, sería interesante saber si malloc() y el uso directo de tales asignadores coexisten felizmente sin problemas . Podría imaginar algunas razones por las cuales malloc podría suponer silenciosamente que el montón al que accede es contiguo, incluso si lo llamaría un error de diseño, incluso si estuviera documentado, a menos que el costo adicional para la seguridad no fuera insignificante.

2

Si vas a portar tu aplicación en varias plataformas, diría que deberías crear tu propio conjunto de envoltorios, incluso si usas las funciones C estándar. Eso le dará la mejor flexibilidad cuando cambie de plataforma, ya que su código estará aislado del sistema subyacente de una manera más agradable.

Por supuesto, eso significa que si solo va a programar para plataformas Windows, simplemente use las funciones de Windows y no use las funciones estándar de biblioteca C del mismo tipo.

Al final solo tiene que ser consistente con su elección y estará bien.

3

Es probablemente más información que usted está buscando (y tal vez no es exactamente lo que usted pidió), pero Catch22.net tiene un artículo titulado "Techniques for reducing Executable size" que pueden ayudar a señalar las diferencias en las llamadas a la API de Win32 y llamadas C en tiempo de ejecución.

+0

gracias por el enlace. toca muchos temas interesantes, incluida información relevante sobre este tema. –

-1

Bueno, actualmente trato de evitar incluir fstream, sstream, iostream y muchos archivos de biblioteca estándar C y usar winAPI porque incluir cualquiera de estas bibliotecas aumenta el tamaño del ejecutable de salida de aproximadamente 10 KB a aproximadamente 500 KB . Pero a veces es mejor usar la biblioteca estándar C para hacer que su código sea multiplataforma. Así que creo que depende de su objetivo.