1

我正在使用 C++(在 xcode 和 code::blocks 中),我不太了解。我想在运行时做一些可编译的东西。

例如:

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

它应该编译 prog 的内容。我读了一些关于 quines 的文章,但对我没有帮助。

4

4 回答 4

7

这是可能的,但不是便携的,也不是简单的。基本上,您必须将代码写入文件,然后将其编译为 dll(使用 调用编译器system),然后加载 dll。第一个很简单,最后一个不太难(但需要实现特定的代码),但中间步骤可能具有挑战性:显然,它只有在系统上安装了编译器时才有效,但你必须找到它的位置已安装,验证它是否是相同版本(或至少是生成二进制兼容代码的版本),使用编译代码时使用的相同选项调用它,并处理任何错误。

C++ 不是为此而设计的。(编译语言通常不是。)

于 2013-07-31T15:51:49.523 回答
1

简短的回答是“不,你不能那样做”。C 和 C++ 的设计初衷从未如此。

这几乎也是对实际问题的长答案,但我将扩展一些想法。

由编译器编译的代码肯定不是微不足道的。有一些技术可用于向程序“添加更多代码”:

  1. 添加一个动态共享库 (DLL),其中包含已与现有代码分开编译的代码。你当然也可以在你的程序中有代码来输出一些代码,用编译器编译这个代码,把它链接到一个动态库中,然后把它加载到你的代码中。

  2. 您可以构建自己的小型代码生成器,在一块内存中生成机器代码。请注意,您可能需要调用“特殊”内存分配函数,因为通常不允许执行“正常”内存分配 - 您需要“使用执行权限”分配 -VirtualAlloc在 Windows 中确实有这样一个标志,而mmap在 Linux 中/Unix 风格也是如此。当然,您几乎必须“成为一名编译器”才能实现这一目标。

  3. 您自然也可以发明自己的解释语言,这将允许您的程序加载例如带有要执行的命令/指令的文本文件,或者在程序中包含文本以使用该语言执行。

但就像我一开始说的那样,这不是 C 和 C++(以及大多数其他编译语言)的本意,所以它不会像“将一些 C++ 代码粘贴到字符串中并使其运行”那么简单。

于 2013-07-31T15:58:39.210 回答
0

这取决于您为什么要这样做。

如果是出于效率原因——你知道一个函数只在运行时做什么,但它必须非常高效——那么已经建议的内容(写入文件、编译为 dll / so 并动态加载它)是你最好的选项。

但是,如果您想要这样做的原因是允许用户输入行为,请说您从数据库中读取的一般功能(行为或单位游戏?情节中字段的值?) - 或者更一般地说,您只是想改变/ 增强运行时的行为,几乎不关心效率,我建议使用外部脚本语言,如lua,它可以轻松与编译的 C++ 代码交互。

于 2013-07-31T16:04:46.093 回答
0

C 和 C++ 语言编译为二进制机器代码,与 Java 和 C# 不同,Java 和 C# 为“虚拟机”或解释脚本语言(如 JavaScript)生成指令。C++ 的编译是由一个单独的可执行文件编译器执行的,它不会合并到生成的可执行文件中。

因此,一旦编译完成,该语言没有任何内置的“eval”功能来翻译进一步的代码。

新 C/C++ 程序员认为他们需要这样做的情况并不少见,但他们通常不需要这样做。也许您可以进一步扩展您实际想要做的事情。

但是,如果您确实需要能够做到这一点,您的选择是:

  1. 编写代码以使用新代码编译新的可执行文件,然后运行生成的程序。
  2. 编写一个简单的解析器和你自己的“虚拟机”,
  3. 考虑合并嵌入式脚本/解释语言,例如Lua
  4. 尝试整合CINT

另请参阅:C++ 脚本语言

于 2013-07-31T16:06:07.080 回答