最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年04月23日 10:16:29   投稿:junjie  
這篇文章主要介紹了Lua中調(diào)用C語言函數(shù)實(shí)例,本文先講解了相關(guān)知識,然后給出了調(diào)用實(shí)例,需要的朋友可以參考下

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

當(dāng)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ù),他們有各自獨(dú)立的局部棧。第一個參數(shù)的索引是1。
作為第一個例子,讓我們看看如何實(shí)現(xiàn)一個簡單的函數(shù),返回給定2個參數(shù)的和:

復(fù)制代碼 代碼如下:

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中定義了:
復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

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

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

完整代碼:
復(fù)制代碼 代碼如下:

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


(完)

相關(guān)文章

  • 使用lua實(shí)現(xiàn)split字符串分隔

    使用lua實(shí)現(xiàn)split字符串分隔

    Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過來調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用。不僅僅作為擴(kuò)展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和維護(hù)。
    2014-11-11
  • Lua中三種循環(huán)語句的使用講解

    Lua中三種循環(huán)語句的使用講解

    今天小編就為大家分享一篇關(guān)于Lua中三種循環(huán)語句的使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Lua中訪問table里函數(shù)的方法示例

    Lua中訪問table里函數(shù)的方法示例

    這篇文章主要介紹了Lua中訪問table里函數(shù)的方法示例,本文例子超級簡單,算是入門實(shí)例吧,其實(shí)只需要表名.方法名即可訪問,重要的還是其它代碼寫法,本文給出了一個完整的代碼示例,需要的朋友可以參考下
    2015-04-04
  • Lua教程(三):值與類型介紹

    Lua教程(三):值與類型介紹

    這篇文章主要介紹了Lua教程(三):值與類型介紹,本文起講解了Lua的八種基本類型、userdata、thread、table等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    這篇文章主要介紹了Lua中獲取utf8字符串長度的方法和自定義函數(shù),本文給出了代碼實(shí)例并講解了UTF8的編碼規(guī)則,需要的朋友可以參考下
    2015-04-04
  • Lua教程(三):C語言、C++中調(diào)用Lua的Table示例

    Lua教程(三):C語言、C++中調(diào)用Lua的Table示例

    這篇文章主要介紹了Lua教程(三):C語言、C++中調(diào)用Lua的Table示例,即在C語言、C++中讀取、操作Lua的Table,需要的朋友可以參考下
    2014-09-09
  • 使用lua實(shí)現(xiàn)php的print_r()函數(shù)功能

    使用lua實(shí)現(xiàn)php的print_r()函數(shù)功能

    筆者比較熟悉php,所以一直在做一些使用lua來實(shí)現(xiàn)php中函數(shù)的功能,算是自己對lua理解的一個小測試吧
    2014-11-11
  • Lua中的數(shù)學(xué)庫總結(jié)

    Lua中的數(shù)學(xué)庫總結(jié)

    這篇文章主要介紹了Lua中的數(shù)學(xué)庫總結(jié),本文羅列了Lua5.1中數(shù)學(xué)庫的所有函數(shù),需要的朋友可以參考下
    2014-11-11
  • Lua教程(二):基礎(chǔ)知識、類型與值介紹

    Lua教程(二):基礎(chǔ)知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua之wrap函數(shù)用法示例

    Lua之wrap函數(shù)用法示例

    這篇文章主要介紹了Lua之wrap函數(shù)用法示例,本文同時總結(jié)了wrap和Create的區(qū)別,需要的朋友可以參考下
    2015-04-04

最新評論

乌兰县| 阳城县| 谢通门县| 乐亭县| 新民市| 八宿县| 徐水县| 邵东县| 馆陶县| 清流县| 霍林郭勒市| 凤凰县| 巨鹿县| 张家港市| 桦甸市| 吉木乃县| 荥经县| 武乡县| 达拉特旗| 永兴县| 道孚县| 黄石市| 平江县| 湖北省| 增城市| 井研县| 岳阳市| 名山县| 井冈山市| 阳原县| 金昌市| 康保县| 贡觉县| 资兴市| 清徐县| 凭祥市| 齐齐哈尔市| 宜春市| 通化县| 青州市| 永嘉县|