Pergunta

O manual do Python diz que você pode criar módulos para Python em C e C ++. Você pode tirar proveito de coisas como aulas e modelos ao usar C ++? Não criaria incompatibilidades com o restante das bibliotecas e com o intérprete?

Foi útil?

Solução

Não importa se a sua implementação das funções do gancho é implementada em C ou em C ++. Na verdade, eu já vi algumas extensões Python que fazem uso ativo dos modelos C ++ e até da biblioteca Boost. Sem problemas. :-)

Outras dicas

As pessoas do Boost têm uma boa maneira automatizada de fazer o embrulho de código C ++ para uso pelo Python.

É chamado: boost.python

Ele lida com algumas das construções de C ++ melhor que o SWIG, principalmente a metaprogramação do modelo.

O que você está interessado é um programa chamado GOLE. Ele gerará invólucros e interfaces do Python para o código C ++. Eu o uso com modelos, herança, namespaces etc. e funciona bem.

Você deve usar todos os recursos da linguagem C ++. o Estendendo a documentação do Python (2.6.2) diz que você pode usar o C ++, mas menciona as advertências de seguidores:

É possível escrever módulos de extensão em C ++. Algumas restrições se aplicam. Se o programa principal (o intérprete Python) for compilado e vinculado pelo compilador C, objetos globais ou estáticos com construtores não poderão ser usados. Isso não é um problema se o programa principal estiver vinculado pelo compilador C ++. As funções que serão chamadas pelo intérprete Python (em particular, as funções de inicialização do módulo) devem ser declaradas usando "C" externo. É desnecessário envolver os arquivos de cabeçalho do Python em extern "c" {...} - eles já usam esse formulário se o símbolo __cplusplus for definido (todos os compiladores C ++ recentes definem esse símbolo).

A primeira restrição, "objetos globais ou estáticos com construtores não podem ser usados", tem a ver com a maneira como a maioria dos compiladores C ++ inicializa objetos com esse tipo de duração de armazenamento. Por exemplo, considere o seguinte código:

class Foo { Foo() { } };

static Foo f;

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

O compilador precisa emitir código especial para que o construtor 'foo' seja chamado para 'f' antes que o principal seja executado. Se você tiver objetos com duração de armazenamento estático em sua extensão Python e O intérprete Python não é compilado e vinculado ao C ++, esse código de inicialização especial não será criado.

A segunda restrição, "As funções que serão chamadas pelo intérprete Python (em particular, as funções de inicialização do módulo) devem ser declaradas usando o externo" C "", tem a ver com o nome C ++. A maioria dos compiladores de C ++ acumulam seus nomes para que possam usar os mesmos vinculadores fornecidos para as cadeias de ferramentas C. Por exemplo, digamos que você tinha:

void a_function_python_calls(void* foo);

O compilador C ++ pode converter referências ao nome 'a_function_python_calls' em algo como 'a_function_python_calls@1vga'. Nesse caso, você pode obter um externo não resolvido ao tentar vincular -se à biblioteca Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top