C es uno de los idiomas más antiguos que existen. Su ABI es simple, y prácticamente todos los sistemas operativos que todavía están en uso se han escrito en ella . Mientras que algunos de esos sistemas operativos pueden haber agregado cosas, por ejemplo. en C # / .NET o en la parte superior, abajo están muy empapados en C.
Eso significa que, para utilizar la funcionalidad provista por el sistema operativo, prácticamente todos los lenguajes de programación necesitan una forma de interactuar con las bibliotecas de C de todos modos . Perl, Java, C ++, todos ellos de forma nativa proporcionan formas de "hablar C", porque tenían que hacerlo si no querían reinventar cada rueda individual que hay.
Esto hace que C sea el latín de los lenguajes de programación. (¿Cuántos años de Internet antes de esa metáfora tiene que ser "el inglés de los lenguajes de programación"?)
Cuando escribes tu biblioteca en C, obtienes una interfaz compatible con C de forma gratuita (obviamente). Si está escribiendo su biblioteca en C ++, puede obtener enlaces C, a través de las declaraciones extern "C"
que mencionó.
Sin embargo , puede obtener esos enlaces solo para la funcionalidad que puede expresarse en C .
Por lo tanto, la API de su biblioteca no puede hacer uso de ...
- plantillas,
- clases,
- excepciones,
- cualquier función tomando o devolviendo objetos.
Un ejemplo simple, necesitaría hacer que las funciones exportadas tomen y devuelvan las matrices ( []
) en lugar de std::vector
(o std::string
para eso) materia).
Por lo tanto, no solo no podría proporcionar ninguna de las cosas buenas que C ++ tiene para ofrecer a los clientes de su biblioteca, sino que también tendría que hacer un esfuerzo adicional para "traducir" el API de su biblioteca. de C ++ a "C compatible" ( extern "C"
).
Es por eso que el punto podría señalarse que C es la mejor opción para implementar una biblioteca. Personalmente, creo que los beneficios de C ++ aún superan el esfuerzo necesario para un extern "C"
API, pero eso es solo para mí.