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 se usan hoy en día se han escrito en él . Si bien algunos de esos sistemas operativos pueden haber agregado cosas, por ejemplo, en C # / .NET o lo que sea en la parte superior, a continuación están muy inmersos en C.
Eso significa que, para utilizar la funcionalidad proporcionada por el sistema operativo, prácticamente todos los lenguajes de programación necesitan una forma de interactuar con las bibliotecas C de todos modos . Perl, Java, C ++, todos de forma nativa proporcionan formas de "hablar C", porque tenían que hacerlo si no querían reinventar cada rueda 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 escribe su biblioteca en C, obtiene una interfaz compatible con C de forma gratuita (obviamente). Si está escribiendo su biblioteca en C ++, puede obtener enlaces C, a través de extern "C"
declaraciones como usted mencionó.
Sin embargo , se puede conseguir esas fijaciones solamente para la funcionalidad que puede ser expresado en C .
Por lo tanto, su API de biblioteca no puede hacer uso de ...
- plantillas,
- clases
- excepciones,
- cualquier función que tome o devuelva objetos.
Un ejemplo simple, necesitaría hacer que sus funciones exportadas tomen y devuelvan matrices ( []
) en lugar de std::vector
(o std::string
para el caso).
Por lo tanto, no solo no podrá proporcionar ninguna de las cosas buenas que C ++ tiene para ofrecer a los clientes de su biblioteca, sino que también tendrá que hacer un esfuerzo adicional para "traducir" la API de su biblioteca de C ++ a "C compatible" ( extern "C"
).
Es por eso que se puede señalar 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 una extern "C"
API, pero solo soy yo.