上一篇文章描述了Lua和C交互的原理, 這篇文章主要通過(guò)Demo程序加深Lua和C的交互. 涉及到交互,分為:
- Lua中如何調(diào)用C函數(shù)
- C中如何調(diào)用Lua函數(shù)
這里先描述C中如何調(diào)用Lua函數(shù), 想象一下, C到底怎么和Lua進(jìn)行通信,如何告訴它我調(diào)用的是xxx參數(shù)?
- Lua采取的是利用棧進(jìn)行交互
- Lua提供了C API對(duì)棧進(jìn)行操作, 利用各種Lua_pushXXX將不同的值壓入棧中,然后調(diào)用Lua腳本時(shí)自然會(huì)退棧取出參數(shù)運(yùn)行
- Lua棧狀態(tài)需要自己進(jìn)行維護(hù)榨婆,若發(fā)生多線程同時(shí)對(duì)Lua棧操作纲辽,沒(méi)有加鎖保護(hù)的話會(huì)導(dǎo)致棧狀態(tài)混亂
hello.lua
str = "hello world"
-- 定義一個(gè)tab
tb = {name = "hello",id = 20180119}
注意: Lua使用--
表示為注釋
main.c
#include<lua.h>
#include<lauxlib.h>
#include<lualib.h>
#include<stlib.h>
#include<stdio.h>
int main(void)
{
char *str;
lua_State *L;
int li;
L = luaL_newstate(); /* 創(chuàng)建Lua虛擬機(jī)*/
luaL_openlibs(L); /* 加載Lua基本庫(kù) */
luaL_loadfile(L, "hello.lua"); /* 加載Lua文件,但是不運(yùn)行 */
lua_pcall(L, 0, 0, 0); /* 運(yùn)行Lua文件,參數(shù)個(gè)數(shù), */
//luaL_dofile(L,"hello.lua");
li = lua_gettop(L); /* 返回棧頂索引(即棧長(zhǎng)度)*/
lua_getglobal(L,"str"); /* 獲取str的值,壓入棧中 */
str=lua_tostring(L,1); /* 出棧,將給定索引處的Lua值轉(zhuǎn)換為C字符串 */
printf("str = %s\n",str);
}
-
lua_getglobal(L,"str")
- 執(zhí)行兩步操作
- 首先將str放入棧中
- 然后由Lua去全局表中匹配str的值,并將str的值返回棧頂
-
luaL_dofile(L,"helloscript.lua");
- 它是這樣子定義的:
#define luaL_dofile(L,fn) (LuaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
- 相當(dāng)于
luaL_loadfile + lua_pcall
,不僅加載而且運(yùn)行
- 它是這樣子定義的: