首先我们运行C语言宿主程序,然后从中加载lua脚本。由于加载会失败,所以我们还需要从中判断是否有加载时的语法错误。
main.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
printf("——————开始运行脚本——————\n");
printf("栈顶的索引为:%d\n",lua_gettop(L));
if(0!= luaL_loadfile(L, "main.lua")){
printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
exit(0);
}
printf("栈顶的索引为:%d\n",lua_gettop(L));
if(0!= lua_pcall(L,0,0,0)){
printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
}
printf("栈顶的索引为:%d\n",lua_gettop(L));
printf("——————脚本运行完毕——————\n");
lua_close(L);
return 0;
}
main.lua文件:
function add(x,y)
print(x + y,"\n")
end
.
编译运行后,我们查看输出结果:
[root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
[root@localhost ~]# ./main
——————开始运行脚本——————
栈顶的索引为:0
加载lua脚本错误:
main.lua:4: unexpected symbol near '.'
[root@localhost ~]#
上面输出抛出了一个错误!
我们发现在main.lua的第四行,有一个无法解析的符号"."。
原来是我不小心输入的时候多按了一个符号。
[root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
[root@localhost ~]# ./main
——————开始运行脚本——————
栈顶的索引为:0
加载lua脚本错误:
main.lua:4: unexpected symbol near '.'
[root@localhost ~]# ./main
——————开始运行脚本——————
栈顶的索引为:0
栈顶的索引为:1
栈顶的索引为:0
——————脚本运行完毕——————
[root@localhost ~]#
修改后再次运行后,正常输出!
从输出内容我们发现,在loadfile
之前虚拟栈的栈顶索引为0,加载脚本后栈顶内容为1。
然而在我们运行pcall
执行脚本后,虚拟栈又被清空后,栈顶索引又变成0;
现在我们再调用lua_getglobal
API将lua脚本内的函数add
入栈,然后传入2个参数来计算加法。
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
printf("——————开始运行脚本——————\n");
printf("栈顶的索引为:%d\n",lua_gettop(L));
if(0!= luaL_loadfile(L, "main.lua")){
printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
exit(0);
}
printf("栈顶的索引为:%d\n",lua_gettop(L));
if(0!= lua_pcall(L,0,0,0)){
printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
}
printf("栈顶的索引为:%d\n",lua_gettop(L));
lua_getglobal(L,"add");
printf("函数add入栈,此时栈顶的索引为:%d\n",lua_gettop(L));
lua_pushnumber(L,10);
lua_pushnumber(L,10);
printf("函数参数入栈,此时栈顶的索引为:%d\n",lua_gettop(L));
lua_pcall(L,2,0,0);
printf("执行函数后,栈顶的索引为:%d\n",lua_gettop(L));
printf("——————脚本运行完毕——————\n");
lua_close(L);
return 0;
}
最终运行结果:
[root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
[root@localhost ~]# ./main
——————开始运行脚本——————
栈顶的索引为:0
栈顶的索引为:1
栈顶的索引为:0
函数add入栈,此时栈顶的索引为:1
函数参数入栈,此时栈顶的索引为:3
20.0
执行函数后,栈顶的索引为:0
——————脚本运行完毕——————
[root@localhost ~]#