Pergunta

Esta questão já tem uma resposta aqui:

Eu tenho um arquivo C ++ origem e um arquivo fonte Python. Eu gostaria arquivo de origem do C ++ para ser capaz de usar o conteúdo do arquivo de origem Python como um grande literal string. Eu poderia fazer algo parecido com isto:

char* python_code = "
#include "script.py"
"

Mas isso não trabalho vai porque não há necessidade de ser \ 's no final de cada linha. Eu poderia copiar e colar manualmente no conteúdo do código Python e cercar cada linha com citações e uma terminação \ n, mas isso é feio. Mesmo que a fonte python vai efetivamente ser compilado em meu aplicativo C ++, eu gostaria de mantê-lo em um arquivo separado porque é mais organizado e funciona melhor com editores (Emacs não é inteligente o suficiente para reconhecer que um C string literal é o código python e alternar para o modo de python enquanto você está dentro dele).

Por favor, não sugere que eu uso PyRun_File, é isso que eu estou tentando evitar, em primeiro lugar;)

Foi útil?

Solução

pré-processador O C / C ++ atua em unidades de símbolos, e uma string literal é uma única token. Como tal, você não pode intervir no meio de um literal string como isso.

Você pode pré-processar script.py em algo como:

"some code\n"
"some more code that will be appended\n"

e #include que, no entanto. Ou você pode usar xxd ​ -i para gerar uma matriz C estática pronto para a inclusão.

Outras dicas

Este não vai chegar até lá, mas ele vai te bem perto.

Assumindo script.py contém o seguinte:

print "The current CPU time in seconds is: ", time.clock()

Em primeiro lugar, envolvê-lo como este:

STRINGIFY(print "The current CPU time in seconds is: ", time.clock())

Então, pouco antes de incluí-lo, faça o seguinte:

#define STRINGIFY(x) #x

const char * script_py =
#include "script.py"
;

Há provavelmente uma resposta ainda mais apertado do que isso, mas eu ainda estou procurando.

A melhor maneira de fazer algo como isso é incluir o arquivo como um recurso se o seu ambiente / conjunto de ferramentas tem essa capacidade.

Se não (como sistemas embarcados, etc.), você pode usar um utilitário bin2c (algo como http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c ). Vai demorar representação binária de um arquivo e cuspir um arquivo de origem C que inclui uma matriz de bytes inicializada a esses dados. Você pode precisar fazer alguns ajustes da ferramenta ou o arquivo de saída se quiser que a matriz para ser '\ 0' terminada.

Incorporar a execução do utilitário bin2c em seu makefile (ou como uma etapa de pré-compilação de tudo o que você está usando para conduzir o seu compilações). Em seguida, basta ter o arquivo compilado e ligado com o seu aplicativo e você tem sua seqüência (ou qualquer outra imagem do arquivo) sentado em um pedaço de memória representada pela matriz.

Se você está incluindo um arquivo de texto como corda, uma coisa que você deve estar ciente de que os fins de linha pode não coincidir com o que funções esperar - isso pode ser outra coisa que você gostaria de adicionar à utilidade bin2c ou você vai querer certificar-se de seus punhos do código seja qual for finais de linha estão no arquivo corretamente. Talvez modificar o utilitário bin2c ter um interruptor '-s' que indica que você quer um arquivo de texto incorportated como uma string de modo finais de linha será normalizado e um byte zero será no final da matriz.

Você vai ter que fazer um pouco do seu próprio processamento no código Python, para lidar com quaisquer aspas duplas, barras invertidas, trigraphs, e possivelmente outras coisas, que aparecem nele. Você pode ao mesmo transformar o tempo novas linhas em \ n (ou barra invertida-escapar deles) e adicione as aspas duplas em cada extremidade. O resultado será um arquivo de cabeçalho gerado a partir do arquivo de origem Python, que você pode então #include. Use o seu processo de construção para automatizar este, de modo que você ainda pode editar a fonte Python como Python.

Você pode usar Cog como parte de seu processo de construção (para fazer o pré-processamento e incorporar o código). Admito que o resultado desta provavelmente não é ideal, desde então você acaba vendo o código em ambos os lugares. Mas a qualquer momento eu ver o "Python", "C ++" e "pré-processador" na proximidade closs, eu sinto que merece uma menção.

Aqui está como automatizar a conversão com cmd.exe

------ ------ html2h.bat

@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g 
echo.
echo ";

Foi chamado como

cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"

e anexado ao código

#include "../Debug/src/html.h"
printf("%s\n", html_page);

Este é bastante abordagem dependente do sistema, mas, como a maioria das pessoas, eu não gostava do modo hexadecimal.

Use fopen, getline e fclose.

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