• Lua转让C功能


    在上一篇文章中(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;
    }

    完整代码:
    /*
     * http://blog.csdn.net/booirror 
     */
    #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;
    }
    (完)

  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5028676.html
Copyright © 2020-2023  润新知