我有一个C ++源文件和一个Python源文件。我希望C ++源文件能够将Python源文件的内容用作大字符串文字。我可以这样做:
char* python_code = "
#include "script.py"
"
但这不起作用,因为需要在每一行的末尾。我可以手动复制并粘贴Python代码的内容,并用引号和终止\ n包围每一行,但这很难看。即使python源有效地编译到我的C ++应用程序中,我也希望将它保存在一个单独的文件中,因为它更有条理并且与编辑器一起工作得更好(emacs不够聪明,无法识别 C 字符串文字是python代码,当你在里面时切换到python模式。)
请不要建议我使用PyRun_File,这是我首先要避免的;)
答案 0 :(得分:35)
C / C ++预处理器以令牌为单位,字符串文字是单个令牌。因此,你不能干预像这样的字符串文字中间。
您可以将script.py预处理为:
"some code\n"
"some more code that will be appended\n"
然而,和#include。或者,您可以使用xxd
-i
生成准备包含的C静态数组。
答案 1 :(得分:9)
这不会让你一直到那里,但它会让你非常接近。
假设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"
;
可能还有比这更紧凑的答案,但我还在搜索。
答案 2 :(得分:4)
执行此类操作的最佳方法是,如果您的环境/工具集具有该功能,则将该文件包含为资源。
如果不是(如嵌入式系统等),您可以使用bin2c实用程序(类似http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c)。它将采用文件的二进制表示并吐出一个C源文件,其中包含一个初始化为该数据的字节数组。如果希望数组被'\ 0'终止,则可能需要对工具或输出文件进行一些调整。
将bin2c实用程序运行到makefile中(或者作为用于驱动构建的任何内容的预构建步骤)。然后只需将文件编译并与您的应用程序链接,并将字符串(或文件的任何其他图像)放在由数组表示的一块内存中。
如果您将文本文件包含为字符串,那么您应该注意的一点是,行结尾可能与函数所期望的不匹配 - 这可能是您想要添加到bin2c实用程序或您的另一件事我想确保你的代码正确处理文件中的任何行结尾。也许修改bin2c实用程序以使用'-s'开关指示您希望将文本文件作为字符串包含在内,这样行结尾将被标准化,并且零字节将位于数组的末尾。
答案 3 :(得分:1)
你将不得不对Python代码进行一些自己的处理,以处理出现在其中的任何双引号,反斜杠,三字符以及可能的其他内容。您可以同时将换行符转换为\ n(或反斜杠 - 转义它们)并在两端添加双引号。结果将是从Python源文件生成的头文件,然后您可以#include。使用您的构建过程自动执行此操作,以便您仍然可以将Python源编辑为Python。
答案 4 :(得分:1)
您可以使用Cog作为构建过程的一部分(进行预处理和嵌入代码)。我承认这个结果可能并不理想,因为那时你最终会看到两个地方的代码。但是每当我看到“Python”,“C ++”和“预处理器”处于接近的位置时,我觉得值得一提。
答案 5 :(得分:-1)
以下是使用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);
这是一种非常依赖系统的方法,但是,作为大多数人,我不喜欢十六进制转储。
答案 6 :(得分:-8)
使用fopen
,getline
和fclose
。