无论何时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




10-05 18:21