如何将字符串转换为c中的命令?

时间:2014-10-20 07:50:09

标签: c eval

在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);

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

4 个答案:

答案 0 :(得分:5)

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

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

C可以编译为在没有任何类型的外部环境的情况下运行,但即使你包含它,C运行时通常比编译器小得多。 / p>

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

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

自己动手,需要熟悉编译器完成的许多任务,例如tokenizingparsing和评估解析树。这些是大型复杂的主题,在这里不容易通过示例显示。

答案 1 :(得分:2)

你无法在标准C99中做你想做的事。

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

  • 使用一些嵌入式解释器,如LuaGuile等... AFAIK,Lua可移植到任何C99系统。
  • 使用一些bytecode virtual machine,例如nekovmparrot等...
  • 为您的域名特定表达语言编写自己的parser(例如使用recursive descent技术)和评估者或interpreter
  • 在某些代码中生成一些C代码。 gen01.c文件(在运行时),然后将编译(使用gcc -Wall -fPIC gen01.c -O -g -shared -o gen01.so ....)分支到共享对象中,然后动态加载(使用"./gen01.so"上的dlopen(3)和{合适的符号名称上的{1}}共享对象。相信我,我在MELT中这样做,它甚至可以快速地与交互式使用兼容(用你的话说,奢侈品在实践中是可以承受的)!
  • 使用JIT compilationlibjitLLVM之类的GNU lightning库来动态生成机器代码

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

答案 2 :(得分:0)

你不能,但从我收集的内容中你可以运行机器代码。 See this

答案 3 :(得分:0)

你不能这样做。

编译器将您的代码转换为执行的机器代码。 所以字符串不能由C自己执行。

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

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