C++在运行时添加新代码

vnjpjtjt  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(193)

我使用C++(在xcode和code::blocks中),我知道的不多。我想让一些东西在运行时可编译。
例如:

char prog []={"cout<<"helloworld " ;}

字符串
它应该编译prog的内容。我读了一些关于quines的东西,但它对我没有帮助。

qyuhtwio

qyuhtwio1#

这是有可能的,但不是可移植的,也不是简单的。基本上,你必须把代码写出来到一个文件,然后编译成一个dll(用system调用编译器),然后加载dll。第一个很简单,最后一个也不是太难(但需要实现特定的代码),但中间的步骤可能具有挑战性:显然,它只在系统上安装了编译器的情况下才能工作,但你必须找到它的安装位置,验证它是否是同一个版本。(或者至少是生成二进制兼容代码的版本),使用编译代码时使用的相同选项调用它,并处理任何错误。
C++不是为这个设计的(编译语言通常不是)。

rseugnpd

rseugnpd2#

简短的回答是“不,你不能这样做”。C和C从来没有被设计成这样做。
这也是对实际问题的详细回答,但我会扩展一些想法。
编译器编译的代码肯定不是简单的添加东西。有一些技术可以用来“添加更多代码”到程序中:
1.添加一个动态共享库(DLL),其中包含已单独编译到现有代码中的代码。当然,您也可以在程序中添加代码以输出某些代码,使用编译器编译此代码,将其链接到动态库中,并将其加载到代码中。
1.你可以构建自己的小代码生成器,在内存块中生成机器代码。注意,你可能需要调用一个“特殊”的内存分配函数,因为“正常”的内存分配通常是不允许执行的-你需要分配“具有执行权限”-Windows中的VirtualAlloc确实有这样一个标志,Linux/Unix风格的mmap也是如此。当然,你几乎必须“成为一个编译器”才能实现这一点。
1.你自然也可以发明自己的解释语言,这将允许你的程序加载例如一个文本文件,其中包含要执行的命令/指令,或者在程序内部包含文本,以便用这种语言执行。
但就像我一开始说的,这不是C和C
(以及大多数其他编译语言)的目的,所以它不会像“将一些C++代码插入字符串并使其运行”那么简单。

ar7v8xwq

ar7v8xwq3#

这取决于你为什么要这么做。
如果是出于效率的原因--您只知道函数在运行时做什么,但它必须非常高效--那么已经建议的方法(写入文件、编译为dll / so并动态加载)是您的最佳选择。
但是,如果您希望这样做的原因是为了允许用户输入行为,比如您从数据库中读取的一般函数(行为或单位ingame?绘图中字段的值?),或者更一般地说,您只是想在运行时更改/增加行为,而不太关心效率,我建议使用外部脚本语言,如lua,它可以轻松地与您编译的C++代码交互。

sqyvllje

sqyvllje4#

C和 C++ 编译成二进制机器代码,不像Java和C#,它们为“虚拟机”或解释脚本语言(诸如JavaScript)生成指令。C的编译由单独的可执行文件(编译器)执行,该编译器不被合并到所得到的可执行文件中。
因此,该语言没有任何内置的“eval”功能,在编译完成后无法进一步翻译代码。
对于新的C/C
程序员来说,认为他们需要这样做并不罕见,但他们通常不这样做。
但是,如果你确实需要能够做到这一点,你的选择是:
1.编写代码,用新代码编译新的可执行文件,然后运行结果程序。
1.编写一个简单的解析器和您自己的“虚拟机”,
1.看看如何结合嵌入式脚本/解释语言,如Lua
1.试着把你的头脑集中在集成CINT上,
标签:Scripting language for C++

ercv8c1e

ercv8c1e5#

如果您使用的是嵌入式系统,那么您可以生成一个.ko文件,并在运行时使用insmod将其插入。
有关完整的程序How to have a application (C program) for .ko program Linux,请参阅此答案

相关问题