Pregunta

El manual de Python dice que puedes crear módulos para Python tanto en C como en C++.¿Puedes aprovechar cosas como clases y plantillas cuando usas C++?¿No crearía incompatibilidades con el resto de bibliotecas y con el intérprete?

¿Fue útil?

Solución

No importa si su implementación de las funciones de enlace se implementa en C o en C++.De hecho, ya he visto algunas extensiones de Python que hacen uso activo de plantillas de C++ e incluso de la biblioteca Boost. Ningún problema. :-)

Otros consejos

La gente a impulsar tienen una forma automatizada agradable para hacer la envoltura de código C ++ para el uso de pitón.

Se llama: Boost.Python

Se trata de algunas de las construcciones de C ++ mejor que SWIG, metaprogramming particularmente plantilla.

Lo que le interesa es un programa llamado TRAGO . Será generar contenedores Python e interfaces para código C ++. Yo lo uso con plantillas, herencia, espacios de nombres, etc. y funciona bien.

Usted debe ser capaz de utilizar todas las características del lenguaje C ++. El La extensión de la documentación de Python (2.6.2) dice que usted puede usar C ++, pero las menciones las salvedades siguiendo:

  

Es posible escribir la extensión   módulos en C ++. algunas restricciones   aplicar. Si el programa principal (el pitón   intérprete) se compila y se enlaza por   el compilador de C, global o estática   objetos con los constructores no pueden ser   usado. Esto no es un problema si el   programa principal está vinculada por el C ++   compilador. Funciones que serán   llamado por el intérprete de Python (en   en particular, la inicialización del módulo   funciones) tienen que ser declarada usando   extern "C". Es innecesario   adjuntar los archivos de cabecera en Python   extern "C" {...} - que utilizan esta forma   Ya si el símbolo es __cplusplus   (compiladores todo reciente C ++ definidos   definir este símbolo).

La primera restricción, "objetos globales o estáticas con constructores no pueden ser utilizados", tiene que ver con la manera más compilador de C ++ inicializar objetos con este tipo de tiempo de almacenamiento. Por ejemplo, considere el siguiente código:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

El compilador tiene que emitir un código especial para que el constructor 'Foo' se invoca para la 'f' antes principal es ejecutado. Si tiene objetos con una duración de almacenamiento estático en su extensión de Python y el intérprete de Python no se compila y se enlaza para C ++, entonces este código especial de inicialización no se creará.

La segunda restricción, "Funciones que será llamado por el intérprete de Python (en particular, las funciones del módulo de inicialización) tienen que ser declaradas usando extern 'C'", tiene que ver con C ++ nombre mangling. La mayoría de los compiladores de C ++ mangle sus nombres para que puedan utilizar los mismos enlazadores previstas toolchains C. Por ejemplo decir que tenía:

void a_function_python_calls(void* foo);

compilador de C ++ pueden convertir referencias al nombre 'a_function_python_calls' a algo así como 'a_function_python_calls @ 1VGA'. En cuyo caso se puede obtener una asignatura pendiente externa al intentar enlazar con la biblioteca de Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top