C/C++, 문자열 리터럴에 #파일을 포함할 수 있습니까?
저는 C++ 소스 파일과 Python 소스 파일을 가지고 있습니다.Python 소스 파일의 내용을 큰 문자열 리터럴로 사용할 수 있도록 C++ 소스 파일을 만들고 싶습니다.난 이렇게 할 수 있어:
char* python_code = "
#include "script.py"
"
그러나 각 행의 말미에 \가 있어야 하기 때문에 이 방법은 사용할 수 없습니다.Python 코드의 내용을 수동으로 복사하여 붙여넣고 각 행을 따옴표와 끝 \n으로 묶을 수 있지만, 그것은 보기 흉합니다.Python 소스가 효과적으로 C++ 앱으로 컴파일될 예정이지만, 더 체계적이고 편집자와 더 잘 작동하기 때문에 별도의 파일에 보관하고 싶습니다(emacs는 C 문자열 리터럴이 python 코드임을 인식하고 python 모드로 전환될 만큼 똑똑하지 않습니다).
PyRun_File을 사용하도록 제안하지 말아주세요.처음부터 피하려고 합니다.
C/C++ 프리프로세서는 토큰 단위로 동작하며 문자열 리터럴은 단일 토큰입니다.따라서 문자 그대로 문자열 중간에는 개입할 수 없습니다.
script.py을 다음과 같이 전처리할 수 있습니다.
"some code\n"
"some more code that will be appended\n"
하지만 #그건 아니야.또는 를 사용할 수 있습니다. -i
C는 C c 、 C c 、 C c 、 C c 、 C c 、 C c 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 유틸리티를 변경하여 문자열로 변환되지 않은 텍스트 파일을 원하는 '-s' 스위치를 지정하여 행 끝이 정규화되고 배열 끝에 0바이트가 있도록 합니다.
Python 코드에 표시되는 모든 이중 따옴표, 백슬래시, 삼각문자 및 기타 가능한 것들을 처리하기 위해 Python 코드에 대한 자체 처리를 수행해야 합니다.동시에 새 행을 \n(또는 백슬래시 이스케이프)으로 변환하고 양쪽 끝에 이중 따옴표를 추가할 수 있습니다.그 결과 Python 소스 파일에서 생성된 헤더 파일이 생성됩니다.이 파일은 #포함할 수 있습니다.빌드 프로세스를 사용하여 이를 자동화하면 Python 소스를 Python으로 편집할 수 있습니다.
Cog를 빌드 프로세스의 일부로 사용할 수 있습니다(전처리 및 코드 삽입).그 결과 이상적이지 않을 수 있다는 것은 인정합니다.그러면 양쪽에서 코드를 볼 수 있게 됩니다.하지만 Python, C++, Preprocessor를 가까이서 볼 때마다 언급할 가치가 있다고 생각합니다.
cmd를 사용하여 변환을 자동화하는 방법은 다음과 같습니다.실행
-----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);
이것은 꽤 시스템에 의존하는 접근법이지만, 대부분의 사람들이 그렇듯이, 나는 육각 덤프를 싫어했다.
사용하다fopen
,getline
,그리고.fclose
.
언급URL : https://stackoverflow.com/questions/1246301/c-c-can-you-include-a-file-into-a-string-literal
'source' 카테고리의 다른 글
롤업 Vue2 - 빌드 실패 (0) | 2022.08.08 |
---|---|
iPhone에서 Objective-C를 사용한 메서드 이름 NSLogg (0) | 2022.08.08 |
Vue.js 데이터 인스턴스 내의 cytoscape 객체를 어떻게 저장합니까? (0) | 2022.08.08 |
char가 표준으로 1이면 size of(char)이라고 쓰는 이유는 무엇입니까? (0) | 2022.08.07 |
주체, 사용자 및 주체 간의 의미와 차이점은 무엇입니까? (0) | 2022.08.07 |