国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 綜合 > 正文

Lua教程(二十):Lua調用C函數

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

Lua可以調用C函數的能力將極大的提高Lua的可擴展性和可用性。對于有些和操作系統相關的功能,或者是對效率要求較高的模塊,我們完全可以通過C函數來實現,之后再通過Lua調用指定的C函數。對于那些可被Lua調用的C函數而言,其接口必須遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。簡單說明一下,該函數類型僅僅包含一個表示Lua環境的指針作為其唯一的參數,實現者可以通過該指針進一步獲取Lua代碼中實際傳入的參數。返回值是整型,表示該C函數將返回給Lua代碼的返回值數量,如果沒有返回值,則return 0即可。需要說明的是,C函數無法直接將真正的返回值返回給Lua代碼,而是通過虛擬棧來傳遞Lua代碼和C函數之間的調用參數和返回值的。這里我們將介紹兩種Lua調用C函數的規則。

1. C函數作為應用程序的一部分。

復制代碼 代碼如下:

#include <stdio.h>
#include <string.h>
#include <lua.hpp>
#include <lauxlib.h>
#include <lualib.h>

 

//待Lua調用的C注冊函數。
static int add2(lua_State* L)
{
    //檢查棧中的參數是否合法,1表示Lua調用時的第一個參數(從左到右),依此類推。
    //如果Lua代碼在調用時傳遞的參數不為number,該函數將報錯并終止程序的執行。
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    //將函數的結果壓入棧中。如果有多個返回值,可以在這里多次壓入棧中。
    lua_pushnumber(L,op1 + op2);
    //返回值用于提示該C函數的返回值數量,即壓入棧中的返回值數量。
    return 1;
}

//另一個待Lua調用的C注冊函數。
static int sub2(lua_State* L)
{
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 - op2);
    return 1;
}

const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    //將指定的函數注冊為Lua的全局函數變量,其中第一個字符串參數為Lua代碼
    //在調用C函數時使用的全局函數名,第二個參數為實際C函數的指針。
    lua_register(L, "add2", add2);
    lua_register(L, "sub2", sub2);
    //在注冊完所有的C函數之后,即可在Lua的代碼塊中使用這些已經注冊的C函數了。
    if (luaL_dostring(L,testfunc))
        printf("Failed to invoke./n");
    lua_close(L);
    return 0;
}

 

2. C函數庫成為Lua的模塊。

將包含C函數的代碼生成庫文件,如Linux的so,或Windows的DLL,同時拷貝到Lua代碼所在的當前目錄,或者是LUA_CPATH環境變量所指向的目錄,以便于Lua解析器可以正確定位到他們。在我當前的Windows系統中,我將其copy到"C:/Program Files/Lua/5.1/clibs/",這里包含了所有Lua可調用的C庫。見如下C語言代碼和關鍵性注釋:

復制代碼 代碼如下:

#include <stdio.h>
#include <string.h>
#include <lua.hpp>
#include <lauxlib.h>
#include <lualib.h>

 

//待注冊的C函數,該函數的聲明形式在上面的例子中已經給出。
//需要說明的是,該函數必須以C的形式被導出,因此extern "C"是必須的。
//函數代碼和上例相同,這里不再贅述。
extern "C" int add(lua_State* L)
{
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 + op2);
    return 1;
}

extern "C" int sub(lua_State* L)
{
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 - op2);
    return 1;
}

//luaL_Reg結構體的第一個字段為字符串,在注冊時用于通知Lua該函數的名字。
//第一個字段為C函數指針。
//結構體數組中的最后一個元素的兩個字段均為NULL,用于提示Lua注冊函數已經到達數組的末尾。
static luaL_Reg mylibs[] = {
    {"add", add},
    {"sub", sub},
    {NULL, NULL}
};

//該C庫的唯一入口函數。其函數簽名等同于上面的注冊函數。見如下幾點說明:
//1. 我們可以將該函數簡單的理解為模塊的工廠函數。
//2. 其函數名必須為luaopen_xxx,其中xxx表示library名稱。Lua代碼require "xxx"需要與之對應。
//3. 在luaL_register的調用中,其第一個字符串參數為模塊名"xxx",第二個參數為待注冊函數的數組。
//4. 需要強調的是,所有需要用到"xxx"的代碼,不論C還是Lua,都必須保持一致,這是Lua的約定,
//   否則將無法調用。
extern "C" __declspec(dllexport)
int luaopen_mytestlib(lua_State* L)
{
    const char* libName = "mytestlib";
    luaL_register(L,libName,mylibs);
    return 1;
}

 

見如下Lua代碼:

復制代碼 代碼如下:

 require "mytestlib"  --指定包名稱
 
 --在調用時,必須是package.function
 print(mytestlib.add(1.0,2.0))
 print(mytestlib.sub(20.1,19))
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
91嫩草在线播放| www.毛片| 日本欧洲一区| 亚洲高清在线免费| 精精国产xxxx视频在线中文版| 国产系列在线观看| 国产精品冒白浆免费视频 | 九色视频网站| 狠狠干婷婷色| 国产精品久久在线| 国产欧美在线观看视频| 国产视频二区三区| av在线免费播放网站| 国产在线视精品麻豆| 尤物网址在线观看| 亚洲精品在线视频免费| 青青草观看免费视频在线| 日本中文字幕在线播放| av在线free| 天天av天天爱| 在线观看视频污| 国内自拍视频在线观看| 中文产幕区在线观看| 久久国产综合视频| 在线免费观看黄色片| 久热国产视频| 国产一二三区在线| 人日人天天爽| 精品视频一二区| 国产欧美在线观看视频| 九九在线免费视频| www免费在线观看视频| 国产美女视频一区二区三区 | 国产一区二区三区美女秒播| 国产精品久久一区二区三区不卡| 中文字幕4区| 99视频资源网| 国产第一页在线视频| 四虎成年永久免费网站| 国产精品第八页| 国产精品作爱| 国产精品一区二区婷婷| 九九热视频在线| 久草视频国产| 大香伊人久久| 黄色av免费在线| 国产在线视精品麻豆| 男女午夜视频在线观看| www狠狠操| 黄色av网站在线| 天天操天天是| 国产网站免费看| 最近免费中文字幕大全免费第三页| 免费高清av| √天堂中文在线| 国产精品国精产品一二| 91美女主播在线视频| 四虎久久影院| 国产69精品久久久久孕妇国产69久久 | 国产一区二区在线|播放| 国产免费视频在线| 国产免费福利网站| 国产福利在线免费观看| 日本免费一二区| 在线视频婷婷| 免费观看v片在线观看| 成网站在线观看人免费| 国产小视频免费在线网址| 国产成+人+亚洲+欧美+综合| 在线国产三级| 黄色av免费在线| 精品国产高清a毛片无毒不卡| 日本在线视频www鲁啊鲁| 国产一二三区在线视频| jizz国产| 在线视频1区2区| 国产中文在线| av在线播放av| 国产精品入口麻豆免费看| 91免费日韩| 久热中文字幕精品视频在线| 国产精品久久久久永久免费看| 亚洲精品xxxxx| 国产成人精品综合网站| 日本中文字幕在线看| 欧美日韩一区二区三区视视频| 国产精品视频一区二区久久| 日本一级理论片在线大全| 制服丝袜中文字幕在线观看| 国产一级性片| 国产无遮挡又黄又爽免费网站| 国产69精品久久app免费版| 亚洲视频在线网| 精品日韩av| 国产丝袜自拍| 国产精品偷乱一区二区三区| 开心婷婷激情| 国产在线超碰| 激情丁香婷婷| 国产主播福利在线| 久久精品视频观看| 免费在线看v| 成年网在线观看免费观看网址| 久草一本av| 综合激情丁香| 五月天丁香在线| 国产三级在线| 91社区在线观看| 午夜在线视频播放| www.三区| 国产免费高清| 精品电影在线| 青草av在线| 导航福利在线| 18激情网站| а√天堂8资源在线官网| 久久精品蜜桃| 国产野外战在线播放| 国产aa视频| www.99av| 尤物网在线观看| 在线免费国产| 国产九色porn网址| 99在线播放| 美女国产在线| 国产精品美女视频免费观看软件| 亚洲最新永久观看在线| 久久99精品久久久久久野外| 国产精品一区二区资源| 中文在线视频观看| 好男人免费精品视频| 国产黄色av免费看| 欧美性xxxx交| 91黄色在线| 中文字幕视频在线观看| 精品一二三区视频| 国产卡1卡2卡三卡在线| 性色视频在线| 天堂中文在线视频| 亚洲综合色视频在线观看| 中文字幕在线播放网址| wwwww在线观看免费视频| 国产视频青青| 尤物在线视频| 九九色在线观看| 四虎影院成人| 香蕉视频在线观看www| 国产黄色小视频| 最新亚洲精品国自产在线观看| 欧美视频免费一区二区三区| 影音先锋在线中文字幕| 国产黄色av免费看| 国产视频资源| 最好2018中文免费视频| 久热免费视频| 欧美艹逼视频| 免费国产视频| 超碰免费在线观看| 久草在线资源福利| 国产免费福利网站| 最新天堂资源在线资源| 天天操天天是| 国产区成人精品视频| 国产三级做爰在线观看| 国产网站免费看| 国产精品久久久久久福利| 国产日本视频| 在线三级中文| 青青草原av在线| 免费的黄网站在线观看| 开心婷婷激情| 狠狠干五月天| 国产精品视频一区麻豆| 国产黄色av免费看| av在线播放av| 免费在线超碰| 国产亚洲精品久久久久久青梅| 国产精品被窝福利一区 | 国产精品视频二区三区| 国产精品18久久久久网站| 国产成人亚洲综合小说区| 在线观看免费高清完整| 超碰在线网站| 国产精品视频流白浆免费视频 | 在线观看av中文| gogogo影视剧免费观看在线观看| 久草在线视频网| 国产成人亚洲欧美电影| 日韩国产成人| 国产特级嫩嫩嫩bbb| 亚洲精品天堂在线观看| 国产你懂的在线观看| 精品入口蜜桃| 国产精品自产拍在线网站| 999精品网| 国产精品一区二三区| 伊人影院在线视频| 天天操天天射天天色| av在线日韩国产精品| 国产网红在线|