문제

이 질문에는 이미 답변이 있습니다.

C++ 소스 파일과 Python 소스 파일이 있습니다.저는 C++ 소스 파일이 Python 소스 파일의 내용을 큰 문자열 리터럴로 사용할 수 있기를 바랍니다.나는 다음과 같이 할 수 있습니다 :

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

하지만 각 줄의 끝에는 \'가 있어야 하기 때문에 작동하지 않습니다.Python 코드의 내용을 수동으로 복사하여 붙여넣고 각 줄을 따옴표와 종료 으로 묶을 수 있지만 이는 보기 흉합니다.Python 소스가 내 C++ 앱으로 효과적으로 컴파일되더라도 더 체계적이고 편집기에서 더 잘 작동하기 때문에 별도의 파일에 보관하고 싶습니다(emacs는 다음을 인식할 만큼 똑똑하지 않습니다). 문자열 리터럴은 Python 코드이며 그 안에 있는 동안 Python 모드로 전환합니다.)

PyRun_File을 사용하도록 제안하지 마세요. 그것이 제가 처음에 피하려고 하는 것입니다. ;)

도움이 되었습니까?

해결책

C/C++ 전처리기는 토큰 단위로 작동하며 문자열 리터럴은 하나의 토큰.따라서 그런 문자열 리터럴 중간에 개입할 수 없습니다.

script.py를 다음과 같이 전처리할 수 있습니다.

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

그러나 #include 합니다.아니면 당신은 사용할 수 있습니다 xxd​ -i 포함할 준비가 된 C 정적 배열을 생성합니다.

다른 팁

이것은 당신을 끝까지 얻을 수는 없지만, 당신을 꽤 가까이하게 할 것입니다.

가정합니다 script.py 이것을 포함합니다 :

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

먼저 다음과 같이 마무리하십시오.

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

그런 다음 포함하기 직전에 다음을 수행하십시오.

#define STRINGIFY(x) #x

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

아마도 그보다 더 단단한 대답이있을 것입니다. 그러나 나는 여전히 찾고 있습니다.

이와 같은 작업을 수행하는 가장 좋은 방법은 환경/도구 세트에 해당 기능이있는 경우 파일을 리소스로 포함시키는 것입니다.

그렇지 않은 경우 (임베디드 시스템 등) BIN2C 유틸리티를 사용할 수 있습니다 ( http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c). 파일의 이진 표현을 사용하고 해당 데이터에 초기화 된 바이트 배열이 포함 된 C 소스 파일을 뱉어냅니다. 배열이 ' 0'이 종료 되려면 도구 또는 출력 파일을 조정해야 할 수도 있습니다.

BIN2C 유틸리티 실행을 Makefile (또는 빌드를 주도하기 위해 사용하는 모든 것의 사전 건설 단계)에 통합하십시오. 그런 다음 파일을 컴파일하고 애플리케이션과 링크하고 배열로 표시되는 메모리 덩어리에 문자열 (또는 파일의 다른 이미지)이 있습니다.

텍스트 파일을 문자열로 포함시키는 경우, 알아야 할 한 가지는 라인 엔딩이 함수가 기대하는 것에 일치하지 않을 수 있다는 것입니다. 이것은 BIN2C 유틸리티에 추가하고 싶은 또 다른 것일 수 있습니다. 코드가 파일에있는 라인 결말을 처리하는지 확인하십시오. BIN2C 유틸리티를 수정하여 문자열로 텍스트 파일을 정상화하고 배열 끝에 0 바이트가있을 것입니다.

당신은 파이썬 코드에서 자신의 처리 중 일부를 수행하고, 이중 인용, 백 슬래시, 트리 그라 그래프 및 아마도 다른 것들을 처리해야합니다. 동시에 Newlines를 n (또는 Backslash-escape)로 바꾸고 양쪽에 이중 인용물을 추가 할 수 있습니다. 결과는 Python 소스 파일에서 생성 된 헤더 파일이므로 #include가 될 수 있습니다. 빌드 프로세스를 사용하여이를 자동화하여 파이썬 소스를 Python으로 편집 할 수 있습니다.

당신은 사용할 수 있습니다 장부 빌드 프로세스의 일부로 (전처리를 수행하고 코드를 포함시키기 위해). 나는 이것의 결과가 이상적이지 않다는 것을 인정한다. 왜냐하면 당신은 두 곳에서 코드를 보게되기 때문에 아마도 이상적입니다. 그러나 Closs 근접에서 "Python", "C ++"및 "Preprocessor"를 볼 때마다 언급 할 가치가 있다고 생각합니다.

다음은 CMD.exe로 변환을 자동화하는 방법입니다

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

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

그것은처럼 불렸다

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

코드에 첨부

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

이것은 상당히 시스템 의존적 접근 방식이지만 대부분의 사람들과 마찬가지로 나는 16 진 덤프를 싫어했습니다.

사용 fopen, getline, 그리고 fclose.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top