我正在使用C ++(在xcode和code :: blocks中),我不太了解。 我想在运行时编写一些可编译的东西。
例如:
char prog []={"cout<<"helloworld " ;}
它应该编译prog的内容。 我读了一些关于quines的文章,但它对我没有帮助。
答案 0 :(得分:7)
这有点可能,但不是便携式,而不仅仅是。
基本上,您必须将代码写入文件,然后
将其编译为dll(使用system
调用编译器),和
然后加载DLL。第一个是简单的,最后一个也不是
困难(但需要实现特定的代码),但是
中间步骤可能具有挑战性:很明显,它只会起作用
编译器安装在系统上,但你必须找到
安装它的地方,验证它是相同的版本(或
至少一个生成二进制兼容代码的版本),
使用代码时使用的相同选项调用它
编译,并处理任何错误。
C ++不是为此而设计的。 (一般来说是编译语言 不是。)
答案 1 :(得分:1)
简短的回答是“不,你不能那样做”。 C和C ++从来没有设计过这样做。
这也是对实际问题的长期回答,但我会对一些想法进行一些扩展。
编译器编译的代码对于添加内容来说当然不是一件容易的事。有一些技术可用于向程序“添加更多代码”:
添加动态共享库(DLL),其中包含已分别编译到现有代码的代码。您当然也可以在程序中使用代码输出一些代码,使用编译器编译此代码,将其链接到动态库中,然后将其加载到代码中。
您可以构建自己的小代码生成器,在大块内存中生成机器代码。请注意,您可能需要调用“特殊”内存分配函数,因为通常不允许执行“正常”内存分配 - 您需要分配“具有执行权限” - Windows中的VirtualAlloc
确实有这样的flag和Linux / Unix版本中的mmap
也是如此。当然,你几乎必须“成为一个编译器”来实现这一目标。
您当然也可以创建自己的解释语言,这将允许您的程序加载例如带有要执行的命令/指令的文本文件,或者包含程序内的文本以便使用该语言执行。
但是就像我说的那样,这不是C和C ++(以及大多数其他编译语言)的意思,所以它不会像在字符串中粘贴一些C ++代码那样简单,并且跑”。
答案 2 :(得分:0)
这取决于你为什么要这样做。
如果是出于效率的原因 - 你知道函数在运行时的功能是什么,但它必须非常高效 - 那么已经提出了什么(写入文件,编译成dll / so并动态加载它)是你最好的选择。
但是如果你想要这个的原因是允许用户输入行为,比如从数据库中读取的一般函数(行为或单元游戏名称?图中某个字段的值?) - 或者更一般地说你只是想要在运行时更改/扩充行为而不关心效率,我建议使用像lua
这样的外部脚本语言,它可以轻松地与编译的C ++代码交互。
答案 3 :(得分:0)
C和C ++语言编译为二进制机器代码,不同于Java和C#,它为“虚拟机”或解释的脚本语言(如JavaScript)生成指令。 C ++的编译由单独的可执行文件(编译器)执行,该编译器未包含在生成的可执行文件中。
因此,语言没有任何内置的“eval”功能,可以在编译完成后翻译更多代码。
新的C / C ++程序员认为他们需要这样做并不罕见,但他们通常不这样做。也许你可以进一步扩展你真正想做的事情。
但如果你真的需要能够做到这一点,你的选择是: