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

}
(完)

Lua转让C功能的更多相关文章

  1. 使用NGINX+LUA实现WAF功能 和nginx 防盗链

    使用NGINX+LUA实现WAF功能 一.了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: WAF) ...

  2. lua简洁的功能(两)

    Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...

  3. lua三底漆:lua转让c/c++库(动态链接模式)

    dll按功能luaL_openlib出口,然后lua使用package.loadlib导入库函数,基本就是这么个过程,以下上代码来说明一切. #include "stdafx.h" ...

  4. lua转让C++书面DLL达到“热更新”

    原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏server往往有"热更新"的需求 ...

  5. Redis 的Lua Script脚本功能

    从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值 Redis2.6内置的Lua Script支持,可以在Redis的Server端一次 ...

  6. JAVA转让JS功能

    今天,在发展中使用js和Java互动.通常我们使用更多的是js转让Java方法.可以使用dwr.Ajax.jquery.突然发现Java转让js然后,我真的没见过,今天,互联网提供以下信息,顺便总结: ...

  7. cocos2dx for lua 截屏功能

    cocos2dx的utils类中包含截图功能,使用方法如下: cc.utils:captureScreen(function(successed,outputFile)--第一个参数是截图成功或者失败 ...

  8. lua常用一些功能

    lua在openresty中获取请求的请求头 local head_table = ngx.req.get_headers() 由于table类型,无法直接使用ngx.say()显示,需要转换为cjs ...

  9. Lua 函数链功能

    函数链 http://lua-users.org/wiki/FiltersSourcesAndSinks A chain is a function that combines the effect ...

随机推荐

  1. Java基础学习总结(53)——HTTPS 理论详解与实践

    前言 在进行 HTTP 通信时,信息可能会监听.服务器或客户端身份伪装等安全问题,HTTPS 则能有效解决这些问题.在使用原始的HTTP连接的时候,因为服务器与用户之间是直接进行的明文传输,导致了用户 ...

  2. Lucy_Hedgehog techniques

    在project euler 的第\(10\)题的 \(forum\) 中 Lucy Hedgehog 提到的这种方法. 求 \(n\) 以内素数个数以及求 \(n\) 以内素数和的算法. 定义\(S ...

  3. winform中comboBox控件加默认选项的问题

    winform程序设计中,label,TextBox,ComboBox等几个控件几乎是用得最多的,在设计中经常会遇到一些小问题,如:comboBox控件绑定了数据源之后,如何设置默认值? combob ...

  4. Javascript和jquery事件-鼠标移入移出事件

    javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...

  5. 优雅地使用Retrofit+RxJava(二)

    前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现非常多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期.我就写写平时我在使用RxJava+Retrofi ...

  6. 结合Wireshark捕获分组深入理解TCP/IP协议之IP协议

    摘要:     本文简单介绍了网络层理论知识,详细讲解了IP数据报各个字段,并从Wireshark俘获分组中选取IP数据报进行分析,也阐述了分组和分片的区别.   一.IPv4数据报     网络层是 ...

  7. Linux中U盘和SD卡加载卸载命令

    U盘挂载命令U盘插入的时候会显示启动信息,启动信息中sda: sda1指U盘的设备名为sda1dev设备目录下有一个sda1设备文件,此设备文件就是我们插入的U盘,我们将这个设备文件挂载到Linux系 ...

  8. 17、MJPG编码和AVI封装

    一.JPEG和MJPG编码介绍 1.JPEG编码 我个人简单的理解是,JPEG即是Joint Photographic Experts Group(联合图像专家组)的缩写,更是一种图像压缩编码算法.J ...

  9. MFC注册窗口类以及FindWindow按窗口类名查询(避免用#32770获取窗口句柄)

    呵呵,最近在研究SendMessage函数,其中需要用到m_hWnd,之后延伸着又尝试获得窗口的句柄,于是遇到了FindWindow函数,原型如下: HWND FindWindow ( LPCSTR ...

  10. Android Studio SVN使用和VisualSVN-Server配置(图解)

    转载请标明出处: http://blog.csdn.net/zq2114522/article/details/51078544: 本文出自:[梁大盛的博客] Android Studio SVN使用 ...