¿Qué significa exponer públicamente un código C ++ como una API C y cuáles son las ventajas de hacerlo?


25

A menudo escucho a la gente decir que los programadores de C ++ deberían exponer la API pública de su biblioteca / producto como una API C.

¿Qué significa eso y cuáles son sus ventajas?

Respuestas:


44

Significa que la parte de su biblioteca que está expuesta como una interfaz solo usa la "parte" C del lenguaje, por lo que no está exportando clases o similares, solo funciones, POD y estructuras que contienen POD. Además, debe deshabilitar el cambio de nombre de C ++, que generalmente se logra marcando las funciones como extern "C". Un ejemplo típico sería:

extern "C" void foo(int bar);

La gran ventaja de exponer sus bibliotecas de esta manera es que casi todos los lenguajes de programación tienen un mecanismo para interactuar directamente con una biblioteca C, pero solo unos pocos también pueden interactuar directamente con una biblioteca C ++. Entonces, en ese sentido, usted elige el mínimo común denominador para facilitar que otras personas usen su biblioteca.

Sin embargo, tenga en cuenta que esta es realmente una estrategia útil si está produciendo una biblioteca para que otras personas la consuman. Si está creando una pieza de software solo para C ++ y las bibliotecas solo necesitan interactuar entre sí, es mejor que (IMHO) exponga las API de C ++ adecuadas para que pueda utilizar toda la potencia del lenguaje.


14
¡Debe tener cuidado de no exportar excepciones lanzadas tampoco!
James

Esa es una gran respuesta. ¿Me puede dar un ejemplo de las extern "C"cosas que no entendí?
Daniel Ribeiro

1
@DanielRibeiro: solo google para "extern C". Encontrará enlaces como este: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, se agregó un ejemplo muy simple.
Timo Geusch

1
@DanielRibeiro Es técnicamente posible usarlo todavía .hpp, pero esta extensión significa "archivo de encabezado C ++", por lo que debería ser .h, que se usa tanto para C como para C ++.
Leemes

8

Además de la respuesta de Timo: no hay una ABI de C ++ estandarizada para algunas plataformas (por ejemplo, Windows, algunas como Linux de Mac OS X ampliamente adoptadas), por lo que no solo se trata de una función faltante sino de la imposibilidad de implementar dicha función.

Por ejemplo, el IIRC MSVC tiene un ABI diferente en cada versión y puede cambiar dependiendo de si es una depuración o una versión de lanzamiento, y no se publica, por lo que los compiladores de terceros generalmente no son compatibles (leí alguna información de que alguna versión de icc es compatible con MSVC 2005, pero podría ser información divulgada bajo NDA (no necesariamente disponible para los creadores de Python) y usar su propio ABI. Entonces, en la práctica, el entorno del lenguaje limitaría no solo la versión del compilador sino también las banderas.

Finalmente, C ++ tiene muchas más funciones en tiempo de compilación. Por ejemplo, los genéricos generalmente no existen en los idiomas de tipo dinámico, etc.


2
@DanielRibeiro: Bienvenido al maravilloso infierno de C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). La versión corta es que es muy difícil hacer que los componentes de C ++ se compilen por separado (compilados con diferentes compiladores / indicadores) para trabajar juntos en lugar de fallar / fallar silenciosamente.
Maciej Piechotka
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.