麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua中調用C語言函數實例

2024-07-21 23:04:40
字體:
來源:轉載
供稿:網友

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

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

復制代碼 代碼如下:

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注冊的函數都必須是這個原型,它已經在lua.h中定義了:
復制代碼 代碼如下:

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

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

 

在lua中使用該函數之前,我們需要注冊它。使用lua_pushcfunction,它接受一個c函數,然后在lua內部創建一個函數類型的值來表示該函數。

復制代碼 代碼如下:

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

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

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;
}


(完)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩免费一区 | 最近日本电影hd免费观看 | www.mitao| 欧美另类综合 | a一级黄 | 精品国产一区二区三区在线观看 | 久久9色 | 婷婷久久综合九色综合色多多蜜臀 | 精品一区二区久久久久久久网精 | 欧美精品一区二区中文字幕 | gril hd | 黄色一级电影网 | 日韩av片在线播放 | 欧美精品久久久久久久久老牛影院 | 亚洲精品日韩色噜噜久久五月 | 欧美高清另类自拍视频在线看 | 日本在线不卡一区二区 | 久久精品视频黄色 | 久久综合爱 | 毛片118极品美女写真 | 中文字幕在线播放不卡 | 久久99国产精品久久99 | 亚洲视频在线观看免费 | 欧美激情天堂 | 国产做爰全免费的视频黑人 | 羞羞的网址 | 亚洲欧美日韩一区二区三区在线观看 | 九九精品视频观看 | 亚州欧美视频 | 一级黄片毛片免费看 | 久久网国产 | 欧美成人视| 毛片免费视频播放 | 国产一级淫| 国产午夜精品一区二区三区视频 | 一级一级一级一级毛片 | 久久精品成人免费国产片桃视频 | 有色视频在线观看 | 日本在线观看中文字幕 | 特级黄aaaaaaaaa毛片 | 精品国内视频 |