C和 C++ 编译成二进制机器代码,不像Java和C#,它们为“虚拟机”或解释脚本语言(诸如JavaScript)生成指令。C的编译由单独的可执行文件(编译器)执行,该编译器不被合并到所得到的可执行文件中。 因此,该语言没有任何内置的“eval”功能,在编译完成后无法进一步翻译代码。 对于新的C/C程序员来说,认为他们需要这样做并不罕见,但他们通常不这样做。 但是,如果你确实需要能够做到这一点,你的选择是: 1.编写代码,用新代码编译新的可执行文件,然后运行结果程序。 1.编写一个简单的解析器和您自己的“虚拟机”, 1.看看如何结合嵌入式脚本/解释语言,如Lua, 1.试着把你的头脑集中在集成CINT上, 标签:Scripting language for C++
5条答案
按热度按时间qyuhtwio1#
这是有可能的,但不是可移植的,也不是简单的。基本上,你必须把代码写出来到一个文件,然后编译成一个dll(用
system
调用编译器),然后加载dll。第一个很简单,最后一个也不是太难(但需要实现特定的代码),但中间的步骤可能具有挑战性:显然,它只在系统上安装了编译器的情况下才能工作,但你必须找到它的安装位置,验证它是否是同一个版本。(或者至少是生成二进制兼容代码的版本),使用编译代码时使用的相同选项调用它,并处理任何错误。C++不是为这个设计的(编译语言通常不是)。
rseugnpd2#
简短的回答是“不,你不能这样做”。C和C从来没有被设计成这样做。
这也是对实际问题的详细回答,但我会扩展一些想法。
编译器编译的代码肯定不是简单的添加东西。有一些技术可以用来“添加更多代码”到程序中:
1.添加一个动态共享库(DLL),其中包含已单独编译到现有代码中的代码。当然,您也可以在程序中添加代码以输出某些代码,使用编译器编译此代码,将其链接到动态库中,并将其加载到代码中。
1.你可以构建自己的小代码生成器,在内存块中生成机器代码。注意,你可能需要调用一个“特殊”的内存分配函数,因为“正常”的内存分配通常是不允许执行的-你需要分配“具有执行权限”-Windows中的
VirtualAlloc
确实有这样一个标志,Linux/Unix风格的mmap
也是如此。当然,你几乎必须“成为一个编译器”才能实现这一点。1.你自然也可以发明自己的解释语言,这将允许你的程序加载例如一个文本文件,其中包含要执行的命令/指令,或者在程序内部包含文本,以便用这种语言执行。
但就像我一开始说的,这不是C和C(以及大多数其他编译语言)的目的,所以它不会像“将一些C++代码插入字符串并使其运行”那么简单。
ar7v8xwq3#
这取决于你为什么要这么做。
如果是出于效率的原因--您只知道函数在运行时做什么,但它必须非常高效--那么已经建议的方法(写入文件、编译为dll / so并动态加载)是您的最佳选择。
但是,如果您希望这样做的原因是为了允许用户输入行为,比如您从数据库中读取的一般函数(行为或单位ingame?绘图中字段的值?),或者更一般地说,您只是想在运行时更改/增加行为,而不太关心效率,我建议使用外部脚本语言,如
lua
,它可以轻松地与您编译的C++代码交互。sqyvllje4#
C和 C++ 编译成二进制机器代码,不像Java和C#,它们为“虚拟机”或解释脚本语言(诸如JavaScript)生成指令。C的编译由单独的可执行文件(编译器)执行,该编译器不被合并到所得到的可执行文件中。
因此,该语言没有任何内置的“eval”功能,在编译完成后无法进一步翻译代码。
对于新的C/C程序员来说,认为他们需要这样做并不罕见,但他们通常不这样做。
但是,如果你确实需要能够做到这一点,你的选择是:
1.编写代码,用新代码编译新的可执行文件,然后运行结果程序。
1.编写一个简单的解析器和您自己的“虚拟机”,
1.看看如何结合嵌入式脚本/解释语言,如Lua,
1.试着把你的头脑集中在集成CINT上,
标签:Scripting language for C++
ercv8c1e5#
如果您使用的是嵌入式系统,那么您可以生成一个.ko文件,并在运行时使用insmod将其插入。
有关完整的程序How to have a application (C program) for .ko program Linux,请参阅此答案