国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Lua中調(diào)用C語言函數(shù)實例

2024-07-21 23:04:40
字體:
供稿:網(wǎng)友

在上一篇文章(C調(diào)用lua函數(shù))中,講述了如何用c語言調(diào)用lua函數(shù),通常,A語言能調(diào)用B語言,反過來也是成立的。正如Java與c語言之間使用JNI來互調(diào),Lua與C也可以互調(diào)。

當lua調(diào)用c函數(shù)時,使用了和c調(diào)用lua中的同一種棧,c函數(shù)從棧中得到函數(shù),然后將結(jié)果壓入棧中。為了區(qū)分返回結(jié)果和棧中的其他值,每一個函數(shù)返回結(jié)果的個數(shù)。
這里有個重要的概念:這個棧不是全局的結(jié)構(gòu),每個函數(shù)都有自己的私有局部棧。哪怕c函數(shù)調(diào)用了lua代碼,lua代碼再次調(diào)用該c函數(shù),他們有各自獨立的局部棧。第一個參數(shù)的索引是1。
作為第一個例子,讓我們看看如何實現(xiàn)一個簡單的函數(shù),返回給定2個參數(shù)的和:

復制代碼 代碼如下:

static int l_plus(lua_State* L)
{
     lua_Integer a = lua_tointeger(L, 1);
     lua_Integer b = lua_tointeger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

每一個Lua注冊的函數(shù)都必須是這個原型,它已經(jīng)在lua.h中定義了:
復制代碼 代碼如下:

typedef int (*lua_CFunction) (lua_State *L);

由于c函數(shù)返回了一個int類型的返回值個數(shù)。因此,當壓入返回值之前,不必要清理棧,lua會自動移除返回值下面的任何數(shù)據(jù)。

 

在lua中使用該函數(shù)之前,我們需要注冊它。使用lua_pushcfunction,它接受一個c函數(shù),然后在lua內(nèi)部創(chuàng)建一個函數(shù)類型的值來表示該函數(shù)。

復制代碼 代碼如下:

lua_pushcfunction(L, lua_plus);
lua_setglobal(L, "myplus");

一個專業(yè)點的寫法是,我們必須檢查它的參數(shù)類型:
復制代碼 代碼如下:

static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

完整代碼:
復制代碼 代碼如下:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

 

int main()
{
     lua_State *L = luaL_newstate();
     luaL_openlibs(L);
     lua_pushcfunction(L, l_plus);
     lua_setglobal(L, "myplus");
     if (luaL_dostring(L, "print(myplus(2,2))")) {
          lua_close(L);
          error("Failed to invoke");
     }
     lua_close(L);
     return 0;
}


(完)
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新乐市| 长阳| 昭觉县| 长治市| 松江区| 清远市| 新邵县| 长顺县| 靖江市| 山东| 墨竹工卡县| 乌什县| 鹤岗市| 乐山市| 盐源县| 绿春县| 富平县| 南溪县| 临夏市| 宜城市| 体育| 平山县| 大埔县| 虹口区| 灵宝市| 黄梅县| 固阳县| 尤溪县| 广南县| 西昌市| 钟山县| 湟中县| 广饶县| 东光县| 囊谦县| 寿宁县| 南乐县| 镶黄旗| 遵义县| 革吉县| 营口市|