在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);
请注意,我没有奢侈的写入另一个文件并进行编译。
答案 0 :(得分:5)
不,因为C是一种编译语言,所以这并不容易。
C不像典型的动态/脚本语言那样工作,它依赖于大型运行时环境。这些语言通常有一个函数(在Perl和Python,它被称为[eval()
]),它可以做你想要的,但C不能这样做,因为编译器没有留下“在“已编译的程序中,它是一个单独的(并且相当大)的程序。
C可以编译为在没有任何类型的外部环境的情况下运行,但即使你做包含它,C运行时通常比编译器小得多。 / p>
您将不得不从程序中调用实际的编译器,或者自己完成。
当然,调用编译器需要您确切地知道要使用哪个编译器,并且它甚至可以从命令行使用。然后你可以使用例如system()
调用编译器,然后添加代码以检查输出是否正确生成,并使用另一个system()
函数调用来运行新生成的程序。在程序和新编译的程序之间共享数据将非常复杂。
自己动手,需要熟悉编译器完成的许多任务,例如tokenizing,parsing和评估解析树。这些是大型复杂的主题,在这里不容易通过示例显示。
答案 1 :(得分:2)
你无法在标准C99中做你想做的事。
但是,特别是在Linux和其他Posix系统上,你可能会考虑一些技巧,比如
gen01.c
文件(在运行时),然后将编译(使用gcc -Wall -fPIC gen01.c -O -g -shared -o gen01.so
....)分支到共享对象中,然后动态加载(使用"./gen01.so"
上的dlopen(3)和{合适的符号名称上的{1}}共享对象。相信我,我在MELT中这样做,它甚至可以快速地与交互式使用兼容(用你的话说,奢侈品在实践中是可以承受的)!在某些平台上,您可以考虑使用tinycc:它可以非常快速地编译一些C代码(如果使用其dlsym
,甚至可以从一个字符串中编译)到非常慢且未经优化的机器代码中。
答案 2 :(得分:0)
你不能,但从我收集的内容中你可以运行机器代码。 See this
答案 3 :(得分:0)
你不能这样做。
编译器将您的代码转换为执行的机器代码。 所以字符串不能由C自己执行。
您只能使用可以在运行时解析此类命令的库(如果存在C语句)。
但是如果你愿意,我会建议使用C之外的其他语言,因为C针对机器代码进行了优化,而不是用于解析代码。