2010-09-14 19 views

Respuesta

2

C++ puede interoperar con C mediante declaraciones externas "C".

7

Boost.Python tiene macros especiales que declaran funciones con extern "C" para que el intérprete de Python pueda llamarlas. Es un poco complicado, pero puedes mirar el Boost documentation para obtener más información.

4

Python declara una C-API (ver http://docs.python.org/2/c-api/ o http://docs.python.org/3/c-api/). Esta API define un tipo de objeto genérico llamado PyObject que es simplemente una estructura C normal. Esta estructura define (casi) todo lo que un objeto python puede hacer, por ejemplo, lo que sucede cuando se hacen adiciones o comparaciones en este objeto o simplemente lo llaman como una función.

Como los tipos de python también son objetos (y por lo tanto están representados en C por una estructura PyObject), definir un nuevo tipo es una cuestión simple de definir una nueva estructura PyObject como esa. Cuando se llaman a los métodos en Python, el intérprete reenvía la llamada a las funciones C asociadas con esta estructura.

Siempre y cuando una extensión determinada (compilada) proporcione los puntos de entrada correctos para que el intérprete de Python pueda introspeccionarla y averiguar qué está disponible (la documentación que indiqué anteriormente explica esto en detalle), puede usar estos objetos como cualquier otro objeto que normalmente tiene disponible en el prompt - que por cierto, se construyen usando la misma C-API. Le basta import la extensión compilada.

Espero que esté algo claro cómo el intérprete de Python llama cosas desde extensiones compiladas de las anteriores. El único vacío que falta es cómo la C-API llama al código C++.

Boost.Python lo hace al declarar C puntos de entrada en el código a lo largo de las líneas como se explica aquí: Elegantly call C++ from C. Cada vez que llamas, por ejemplo, boost::python::class_, hace esto para el tipo que declaras a python, creando así un PyObject que representa tu clase, con el nombre que elijas. Cuando llame al .def en esta clase, vaya rellenando los espacios internos de esa estructura, declarando más métodos, operadores y atributos de su nuevo tipo. Cada uno de estos espacios internos apunta a una función de estilo C que no es más que un contenedor para la llamada C++ equivalente.

Cuestiones relacionadas