【问题标题】:How to turn a string into commands in c? [duplicate]如何在c中将字符串转换为命令? [复制]
【发布时间】:2014-12-15 03:32:15
【问题描述】:

在 c 中有没有办法将字符串转换为命令?例如:

void x(string n){
   //do something
}
void y(int n){
   //do something
}
void z(int n){
   //do something
}
stringForConvert="z(10);y(2);x(\"Its cool\");";
mysteryCommand(stringForConvert);

请注意,我没有奢侈地写入另一个文件并编译它。

【问题讨论】:

  • 您的意思是eval 函数?不,C没有那个。您将不得不自己解析字符串并解释它。 PS:stringForConvert赋值错误:单引号包含一个char,双引号包含一个字符串
  • 在什么操作系统上?为什么不能奢侈地在文件中编写一些 C 代码(在运行时),然后编译并动态加载它?
  • 'eval' 函数?您将如何解析字符串并解释它?对不起,如果这是基本的;我是 c 的新手!
  • 我不知道 vex 机器人的操作系统。
  • @AsimPoptani:很抱歉,RTFM,这本著名的书“C 编程语言” 包含大量示例和练习,可以让你学会如何做那

标签: c eval


【解决方案1】:

在标准 C99 中,你不能做你想做的事。

但是,特别是在 Linux 和其他 Posix 系统上,您可能会考虑一些技巧,例如

  • 使用一些嵌入式解释器,如 LuaGuile 等... AFAIK,Lua 可移植到任何 C99 系统。
  • 使用一些bytecodevirtual machine,例如nekovmparrot等...
  • 为您的领域特定的表达语言编写自己的parser(例如使用recursive descent 技术)和评估器或interpreter
  • 在某些环境中生成一些 C 代码,例如gen01.c 文件(在运行时),然后将编译(使用 gcc -Wall -fPIC gen01.c -O -g -shared -o gen01.so ....)分叉到共享对象中,然后动态加载(在 "./gen01.so" 上使用 dlopen(3) 并在适当的符号名称上使用 dlsym)共享对象。相信我,我正在 MELT 中这样做,它甚至可以足够快以兼容交互式使用(用你的话来说,奢侈品在实践中是负担得起的)!
  • 使用一些 JIT compilation 库,如 libjitLLVMGNU lightning 动态生成机器代码

在某些平台上,您可能会考虑使用 tinycc:它可以非常快速地将一些 C 代码(甚至可能从字符串,如果使用其 libtcc)编译成非常慢且未经优化的机器代码。

【讨论】:

  • 我无法使用它,因为我不知道它将在哪个操作系统上运行
  • 你真的应该知道这一点。因此,您的第一步是了解目标环境(操作系统、处理器),并了解可用的操作系统、库和编译器。你不能抽象地编程这样的东西。
  • 脚本语言(如 Lua 或 Guile 或 tcl)可以静态链接到您的应用程序。如果你可以为给定的平台编译你的应用程序,你应该没问题。特别是 Lua qhose 唯一的先决条件是使用标准 C 编译器进行编译(我相信 ansi 就足够了)。允许执行任意代码是一个非常非常糟糕的主意。
  • 我不同意“允许执行任意代码”总是是个坏主意。这是一个信任问题。在某些情况下,您可以信任“任意”代码
【解决方案2】:

不,因为 C 是一种编译语言,所以这并不容易。

C 不像典型的动态/脚本语言那样工作,后者依赖于大型运行时环境。这样的语言通常有一个函数(在PerlPython,它被称为[eval()])可以做你想要的,但C 不能这样做,因为编译器没有留在编译程序的“内部”,它是一个单独的(而且相当大的)程序。

C 可以编译为在没有任何 种外部环境的情况下运行,但即使您确实包含它,C 运行时通常也比编译器小得多。

您将不得不从程序中调用实际的编译器,或者全部自己完成。

当然,调用编译器需要您确切知道要使用哪个编译器,甚至可以从命令行使用它。然后你可以使用例如system() 调用编译器,然后添加代码以检查输出是否正确生成,并使用另一个system() 函数调用来运行新生成的程序。在您的程序和新编译的程序之间共享数据将非常复杂。

自己动手需要熟悉编译器完成的许多任务,例如tokenizingparsing,以及评估解析树。这些都是大而复杂的主题,在这里不容易举例说明。

【讨论】:

  • 你能给我举个例子吗
  • @AsimPoptani:这里没有人会免费为您编写代码。如果您遇到特定的与编码相关的问题,您可以求助于该站点。目的是帮助您了解问题,并告诉您如何解决问题。这里解释了 C 中没有 eval 的原因。还列出了替代方案(解析字符串、编译字符串等等)。要求一个可以复制粘贴的例子就是要求人们为你做你的工作。这不会发生
【解决方案3】:

你不能这样做。

当编译器将您的代码翻译成机器代码并被执行时。 所以C不能自己执行String。

您只能使用可以在运行时解析此类命令的库(如果 C 甚至存在的话)。

但如果您愿意,我建议您使用 C 以外的其他语言,因为 C 是针对机器代码优化的,而不是用于解析代码。

【讨论】:

    【解决方案4】:

    你不能,但据我所知,你可能能够运行机器代码。 See this.

    【讨论】:

    • 你能给我举个例子吗
    猜你喜欢
    • 2022-01-19
    • 2020-09-18
    • 2012-01-29
    • 1970-01-01
    • 2015-02-02
    • 2014-03-30
    • 2015-07-04
    • 2010-09-17
    • 2016-01-26
    相关资源
    最近更新 更多