lua源碼學習(一)lua的c api外圍實現

來源:互聯網
上載者:User

標籤:lua 源碼

工作後,整個人已經比較鬆懈了。雖然一直在看lua的源碼,但是一直是比較零碎的時間,沒有系統的整理,所以還是收穫不多。因為最近工作也不是很忙了,就想整理下lua的源碼學習的筆記,加深下印象,並分享給大家。

先說下這系列bolg我會每周更新2-3篇,沒有順序的

這些文章都是自己的淺薄的理解,有什麼錯誤,還請各位拍磚賜教。

1.關於c語言函數的聲明

相信大家都知道介面的重要,在lua中,如果要調用c語言的函數,就必須要有一個統一的函式宣告:

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

但是,我們很多函數都不是這樣的聲明,所以,我們就需要有一個封裝函數:

比如cos函數:

在c語言,標準math庫中,聲明如下:

double cos (double);

經過封裝後:

static int math_cos (lua_State *L) {  lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));  return 1;}

因為lua是一個狀態機器,所有的操作都是在操作棧,所以lua_CFunction中傳入的lua_state這個棧,就可以擷取lua運行中的所有資料了

luaL_checknumber(L,1):表示擷取棧頂的number,並且調用標準c的cos函數,並且cos計算值重新壓棧。

2.關於luaL_Reg映射表

我們介面已經好了,那麼我們在lua中怎麼調用這些函數呢?

<pre name="code" class="html">typedef struct luaL_Reg {  const char *name;  lua_CFunction func;} luaL_Reg;

 


lua為定義了這樣一個結構體,name表示在lua中的函數名字,func表示name真正調用的函數

3.簡短的說下luaopen_math函數調用過程

當我們映射表好了後,要怎樣註冊?

現在比較詳細的說下:

LUAMOD_API int luaopen_math (lua_State *L) {  luaL_newlib(L, mathlib);  lua_pushnumber(L, PI);  lua_setfield(L, -2, "pi");  lua_pushnumber(L, HUGE_VAL);  lua_setfield(L, -2, "huge");  return 1;}

luaL_newlib:這個函數一個宏:建立一個table來儲存我們映射資料(key-value值)。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.