无论何时lua调用c,被调用的函数都得到一个新的栈,这个栈独立于c函数本身的栈,也独立于之前的lua栈。它里面包含了lua传递给c函数的所有参数,而c函数则把要返回的结果放入这个栈以返回个调用者
setglobal
void lua_setglobal (lua_State *L, const char *name);
将虚拟栈中,将栈顶元素弹出,作为全局 lua 变量 name 的值。
lua_newtable
void lua_newtable (lua_State *L);
产生一个空表, 并推入栈。
settable
void lua_settable (lua_State *L, int index);
作一个等价于 t[k] = v 的操作,这里 t 是一个给定有效索引 index 处的值,v 指栈顶的值, 而 k 是栈顶之下的那个值。lua_settable会把栈顶作为value,栈顶的下一个作为key设置到index指向的table,最后把这两个全部弹出栈,这时候settable完成。
lua_setfield
void lua_setfield (lua_State *L, int index, const char *k);
上式,等价于 t[k] = v,t 是栈上索引为index 的表,v 是栈顶的值。函数结束,栈顶值 v会被弹出。
lua访问c中的栈变量
int age = 18;
char* org = "nzhsoft";
lua_pushinteger(L, age);
lua_setglobal(L, "nianling"); //lua里面的变量是nianling,把age推到lua 的全局变量栈中
lua_pushstring(L, org);
lua_setglobal(L, "org");
lua文件
----lua访问c中的变量
print("age=",nianling);
print("org=",org);
---------------------------------------
output:
age=18
org=nzhsoft
Lua访问c的table表
lua_newtable(L); //创建一个表并入栈 idx = -1
lua_pushstring(L, "age");
lua_pushinteger(L, 18); //stack , -1:18, -2:age, -3:table表
printf("stack size = %d\n", lua_gettop(L));
lua_settable(L, -3); //table 在-3的索引,执行settable后,table表在-1位置
printf("stack size = %d\n", lua_gettop(L));
lua_pushstring(L, "org");
lua_pushstring(L, "fangfang"); //stack , -1:fangfang, -2:org, -3:table表
lua_settable(L, -3); //table 在-3的索引,执行settable后,table表在-1位置
lua_setglobal(L, "tab"); //这里就会清空栈, stack size = 0;
lua文件
print("age=",tab.age);
print("org=",tab.org);
-----------------------------------
output:
stack size = 3
stack size = 1
age= 18
org= fangfang
上面代码用lua_setfield实现
lua_newtable(L); //创建一个表并入栈 idx = -1
lua_pushinteger(L, 18);
lua_setfield(L, -2, "age");
lua_pushstring(L, "fangfang");
lua_setfield(L, -2, "org");
lua_setglobal(L, "tab"); //这里就会清空栈, stack size = 0;
------------------------------------------------------------------
output:
stack size = 2
stack size = 1
age= 18
org= fangfang
lua访问c的函数
c函数
//无参无返回
int func(lua_State* L){
printf("hello lua\n");
return 0;
}
//有参无返回
int func2(lua_State* L){
//func2(888,"fangfang") lua是这样调用的,第一个参数先入栈,第二个参数后入栈 -1:"fangfang", -2:888
int num = lua_tointeger(L, -2);
char* str = lua_tostring(L, -1);
printf("num = %d\n", num);
printf("str = %s\n", str);
return 0;
}
//有参有返回
int func3(lua_State* L){
int count = lua_gettop(L);
int sum = 0;
for (int i = 1; i <= count; i++){
sum += lua_tointeger(L, i);
}
printf("stack size = %d\n", lua_gettop(L));
lua_pushinteger(L, sum);
printf("stack size = %d\n", lua_gettop(L));
return 1; //1返回1个参数,2返回2个参数
}
main函数
lua_pushcfunction(L, func);
lua_setglobal(L, "func");
lua_pushcfunction(L, func2);
lua_setglobal(L, "func2");
lua_pushcfunction(L, func3);
lua_setglobal(L, "func3);
lua文件
func() --无参无返回
func2(888,"fangfang") --有参无返回
num = func3(100,200); --有参有返回
print(num);
----------------------------------------------------
output:
hello lua
num = 888
str = fangfang
stack size = 2
stack size = 3
300
返回多个c函数为一个表(c函数表)
int printHello(lua_State* L){
lua_pushstring(L, "hello lua");
return 1;
}
int foo(lua_State* L){
int n = lua_gettop(L);
if (n != 0){
int i = lua_tonumber(L, 1);
lua_pushnumber(L, i + 1);
return 1;
}
return 0;
}
int add(lua_State* L){
int n = lua_gettop(L);
int sum = 0;
for (int i = 1; i <= n; i++){
sum += lua_tonumber(L, i);
}
if (n != 0){
lua_pushnumber(L, sum);
return 1;
}
return 0;
}
static const luaL_Reg myLib[] = {
{ "printHello", printHello },
{ "foo", foo },
{ "add", add },
{ NULL, NULL }
};
main函数
const luaL_Reg* libf = myLib;
for (; libf->func; libf++){ //这里的条件就是libf->func不为NULL
lua_register(L, libf->name, libf->func);
lua_settop(L, 0);
}
lua文件
sum = add(100,200,300);
print(sum);
print(printHello());
print(foo(100));
----------------------------------------------
output:
600.0
hello lua
101.0
c提供函数为table供lua使用 (luaL_requiref)
int printHello(lua_State* L){
lua_pushstring(L, "hello lua");
return 1;
}
int foo(lua_State* L){
int n = lua_gettop(L);
if (n != 0){
int i = lua_tonumber(L, 1);
lua_pushnumber(L, i + 1);
return 1;
}
return 0;
}
int add(lua_State* L){
int n = lua_gettop(L);
int sum = 0;
for (int i = 1; i <= n; i++){
sum += lua_tonumber(L, i);
}
if (n != 0){
lua_pushnumber(L, sum);
return 1;
}
return 0;
}
static const luaL_Reg myLib[] = {
{ "printHello", printHello },
{ "foo", foo },
{ "add", add },
{ NULL, NULL }
};
int luaOpen_my(lua_State* L){
luaL_newlib(L, myLib);
return 1;
}
main函数
luaL_requiref(L, "my", luaOpen_my, 1); //“my”到时候lua调用的时候使用的table的前缀
lua文件
sum = my.add(100,200,300);
print(sum);
print(my.printHello());
print(my.foo(100));
------------------------------------------------
output:
600.0
hello lua
101.0