有没有办法在C ++中从字符串转换为纯代码?

时间:2009-05-05 03:37:09

标签: text

我知道可以从.txt文件中读取然后将其中的各个部分转换为字符串,字符和int值,但是是否可以获取字符串并将其用作程序中的实际代码?< / p>


代码:

string codeblock1="cout<<This is a test;";
string codeblock2="int array[5]={0,6,6,3,5};}";
int i;
cin>>i;
if(i)
{
execute(codeblock1);
}
else
{
execute(codeblock2);
}

其中execute是一个从文本转换为实际代码的函数(我不知道是否存在一个名为execute的函数,我将其用于我的示例)。

9 个答案:

答案 0 :(得分:8)

在C ++中,没有简单的方法可以做到这一点。此功能适用于Python,Lisp,Ruby和Perl等高级语言(通常具有eval函数的某些变体)。但是,即使在这些语言中,这种做法也是不受欢迎的,因为它会导致代码非常难以理解。

重要的是你要问自己(也许告诉我们)为什么要这样做?

或者你只是想知道它是否可能?如果是这样的话,那就是毛茸茸的。你可以编写一个C ++源文件(生成你想要的任何内容,只要它是有效的C ++),然后编译它并链接到你的代码。当然,只要编译器在运行时可用(并且您只需使用system执行它),所有这一切都可以自动完成。我知道有人曾经做过一次重大优化。它不漂亮,但可以使用。

答案 1 :(得分:3)

您可以创建一个函数并解析您喜欢的任何字符串并从中创建数据结构。这称为解析树。随后,您可以检查解析树并生成必要的动态结构以执行逻辑运算。随后将解析树转换为执行的运行时表示。

所有编译器都是这样做的。他们接受您的代码并根据此生成机器代码。在您的特定情况下,您需要一种语言为自己编写代码。通常,这是在代码生成器的上下文中完成的,它是更大的构建过程的一部分。如果您编写一个程序来解析您的语言(考虑使用flex和bison进行此操作),生成代码就可以获得所需的结果。

答案 2 :(得分:3)

许多脚本语言提供了这种功能,一直回到LISP中的eval - 但C和C ++不会在运行时公开编译器。

规范中没有任何内容阻止您创建和执行某些任意机器语言,如下所示:

char code[] = { 0x2f, 0x3c, 0x17, 0x43 }; // some machine code of some sort
typedef void (FuncType*)();               // define a function pointer type
FuncType func = (FuncType)code;           // take the address of the code
func();                                   // and jump to it!

但出于安全原因,如果您尝试此操作,大多数环境都会崩溃。 (许多病毒通过说服普通程序做这样的事情而起作用。)

在正常环境中,您可以做的一件事是创建一个完整的程序作为文本,然后调用编译器来编译它并调用生成的可执行文件。

如果你想在你自己的内存空间中运行代码,你可以调用编译器来构建一个DLL(或.so,具体取决于你的平台),然后在DLL中链接并跳转到它。

答案 3 :(得分:1)

首先,我想说,我从来没有实现过类似的东西,但我可能会离开,但是,您是否在CodeDomProvider命名空间中尝试了System.CodeDom.Compiler类?我感觉System.CodeDom中的课程可以为您提供所需的功能。

当然,它都是.NET代码,而不是任何其他平台

转到here for sample

答案 4 :(得分:0)

是的,你只需要构建一个编译器(可能还有一个链接器)就可以了。

Python等几种语言可以嵌入到C / C ++中,因此可以选择。

答案 5 :(得分:0)

这有点可能,但不仅仅是直接的C / C ++。你需要一些底层,比如LLVM。

结帐c-replccons

答案 6 :(得分:0)

您可以使用Boost Python进行此操作。此时您不会使用C ++,但它是允许用户使用脚本语言与现有程序交互的好方法。我知道这不是你想要的,但也许它可能会有所帮助。

答案 7 :(得分:0)

听起来你正在尝试创建“C ++脚本”,据我所知,它并不存在。 C ++是编译语言。这意味着在执行之前必须始终将其编译为本机字节码。您可以将代码作为函数包装,通过编译器运行,然后动态执行生成的DLL,但是您不会访问编译的DLL通常不会获得的任何内容。

您最好尝试在Java,JavaScript,VBScript或.NET中执行此操作,这些是在一个阶段或另一个解释语言。大多数这些语言都有evalexecute函数,或者只能include作为文本。

当然,执行代码块并不是最安全的想法 - 它会让您容易受到各种数据执行攻击。

我的建议是创建一个服务于您的应用程序的脚本语言。出于安全原因,这将为用户提供有限的指令集,并允许您比编译的外部块更加动态地与现有程序交互。

答案 8 :(得分:0)

不容易,因为C ++是一种编译语言。有几个人已经指出了使其工作的方法 - 执行编译器,或将编译器或解释器合并到程序中。如果您想要使用解释器路线,可以使用现有的开源项目(例如Lua

)来节省大量工作。