如何使用Lua擴展C/C++應用系列2

作者:buxiu  轉自:Lua中文網站(www.luachina.net)

這一篇接着第一個篇"Hello, World!",介紹如何在Lua中定義函數然後在C/C++中調用他,這將涉及到參數傳遞,返回值,全局變量等。
Lua中定義函數非常簡單,以關鍵字function開頭,後面跟上函數名,參數列表,函數體,函數定義以end結尾。Lua中函數可以傳遞多個參數也可有多個返回值。
下面有個簡單的Lua函數,兩個數字相加返回兩者的和。
-- add two numbers

代碼:
function add ( x, y )
    return x + y
    end

在上一篇中我們講到調用lua_dofile()將加載並運行Lua代碼,本節中我們的Lua腳本僅僅定義了一個函數,調用lua_dofile()函數將使得我們的C/C++程序可以訪問Lua中的函數了。
Lua中的函數可以接受多個參數,也可以有多個返回值。這是通過stack來完成的。調用一個函數時,首先將函數放到棧頂,接着按順序放入函數的參數,當我們調用函數lua_call()之後,函數的返回值已經放在棧頂了,這些步驟在下面的luaadd()函數中可以看到。
說明:
1. 調用lua_getglobal()將add()函數壓入棧頂。
2. 第一個參數x,通過調用lua_pushnumber()入棧。
3. 再次調用lua_pushnumber()將第二個參數入棧。
4. 使用lua_call()調用Lua函數。
5. 調用lua_tonumber()從棧頂取得函數的返回值。
6. lua_pop()移除棧頂的值。
將下面的代碼保存爲luaadd.cpp,如果你喜歡用C而不是C++,需要保存文件爲luatest.c並且把extern去掉。
代碼:
#include <stdio.h>

extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

/* the Lua interpreter */
lua_State* L;

int luaadd ( int x, int y )
{
    int sum;

    /* the function name */
    lua_getglobal(L, "add");

    /* the first argument */
    lua_pushnumber(L, x);

    /* the second argument */
    lua_pushnumber(L, y);

    /* call the function with 2
       arguments, return 1 result */
    lua_call(L, 2, 1);

    /* get the result */
    sum = (int)lua_tonumber(L, -1);
    lua_pop(L, 1);

    return sum;
}

int main ( int argc, char *argv[] )
{
    int sum;
    
    /* initialize Lua */
    L = lua_open();

    /* load Lua base libraries */
    lua_baselibopen(L);

    /* load the script */
    lua_dofile(L, "add.lua");
    
    /* call the add function */
    sum = luaadd( 10, 15 );

    /* print the result */
    printf( "The sum is %d/n", sum );

    /* cleanup Lua */
    lua_close(L);

    return 0;
}

編譯:
Linux平臺,鍵入命令:
代碼:
g++ luaadd.cpp -llua -llualib -o luaadd

運行程序:
代碼:
./luaadd

如果正常的話程序應該顯示:"The sum is 25"
如果你不是Linux操作系統,使用的是Vc++編譯器,你需要:
1. 創建一個新的win32控制檯應用工程。
2. 將文件luaadd.cpp添加到你的工程中。
3. 到Project, Settings點擊Link頁。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7編譯程序。
運行程序以前,你需要確保lua+lib.dll文件放在windows可以找到的地方,將這個文件從C:/Program Files/Lua-5.0拷貝到Visual C++ project目錄,如果編譯沒有錯誤的話,現在可以Ctrl+F5運行程序了。
關於全局變量:
如上面我們所看到的,lua_getglobal()將Lua的一個全局變量放至棧頂,假如我們的腳本包含一個全局變量z,下面這段代碼將獲取z的值:
代碼:
lua_getglobal(L, "z");
    z = (int)lua_tonumber(L, 1);
    lua_pop(L, 1);


與之對應的lua_setglobal()用來設置Lua的一個全局變量的值,下面的這段代碼將全局變量z的值設置爲10
代碼:
lua_pushnumber(L, 10);
    lua_setglobal(L, "z");

注意,不需要在你的Lua腳本中顯式的全局變量,如果全局變量不存在,lua_setglobal()將創建一個新的全局變量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章