在一个偶然的机会,接触了javascript。里面有一个神奇的函数eval,之所以称其神奇,因为它能将字符串直接运行。在c语言看来,真的很神奇。
所以,一直在想,如果在C语言里面,也有一个类似的函数,那有多cool。原来我一度以为是很困难的,但,前天突然一个灵感降临,我有一个思路。那就是,通过动态链接库来实现。过程大概是:先将代码存进.c文件里面,然后编译成动态链接库.so,然后动态加载,调用,运行。OK,就这个思路,我实现了初级版本
这个版本显然,是linux下实现的,主要因为linux大多数都是用gcc编译器,且大部分机器都装有,所以比较方便。
Makefile:
all:main.c
gcc -ldl main.c -o main
clean:
rm main *.so
main.c:
#include "stdio.h"
#include "string.h"
#include "dlfcn.h"
#define MAX_CODE 10000
char *code_template ="\
#include \"stdio.h\"\n\
void fun()\
{\
%s\
} ";
/*代码进行编译*/
void compile(char * code)
{
FILE *file=fopen("fun.c","w");
fwrite(code,1,strlen(code),file);
fclose(file);
system("gcc -shared -o libfun.so fun.c");
}
/*接口运行代码*/
int run_code(char *code)
{
void * pdl;
char code_buf[MAX_CODE];
sprintf(code_buf,code_template,code);
compile(code_buf);
pdl = dlopen("./libfun.so",RTLD_LAZY);
if(!pdl)
{
perror("pdl == NULL\n");
return 0;
}
typedef void (*fun_t)();
fun_t fun=dlsym(pdl,"fun");
if(fun)
{
fun();
}else
{
printf("fun==NULL");
}
dlclose(pdl);
}
int main()
{
/*调用测试*/
run_code("printf(\"hello run_code \\n\");");
return 0;
}