在上一篇文章中(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. Tomcat redis 配置

    http://www.cnblogs.com/interdrp/p/4868740.html http://blog.csdn.net/qq584852076/article/details/4650 ...

  2. arduino串口输出问题

  3. FZU Problem 2156 Climb Stairs DP

    http://acm.fzu.edu.cn/problem.php?pid=2156 题目大意: 爬楼梯,要爬到n这个位置,每次可以走x也可以走y,然后一定要经过A和B两点,求最终到达n的方案数. 思 ...

  4. WinPcap 简介

    WinPcap(windows packet capture) 它包括一个核心态的包过滤器NPF,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll). [w ...

  5. Android 调用系统邮件,发送邮件到指定邮箱

    在项目中,最后有一个联络我们,要求是点击号码还有邮箱地址能够发送邮件,这时候解决的方案其实有两种,一种是调用系统发邮件的软件,可以添加邮箱账号就可以发送邮件:第二种是使用javamail来发送邮件.在 ...

  6. 【BZOJ 2754】[SCOI2012]喵星球上的点名

    [链接]h在这里写链接 [题意]     n个人;     由姓和名组成.s1[i]和s2[i];     有m个询问串.     问你第j个询问串,是否为某个人的姓或者名的子串.     如果是的话 ...

  7. MySQLDump在使用之前一定要想到的事情

    MySQLDump经常用于迁移数据和备份. 下面创建实验数据,两个数据库和若干表create database db1 ;use db1;create table t1(id int primary ...

  8. showSoftInput不起作用

    et_add_share_content.postDelayed(new Runnable() {   @Override public void run() { InputMethodManager ...

  9. jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法)

    jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法) 一.总结 1.jquery不懂之处直接看教程,案例都有,有简单又快 2.jquery ...

  10. Html中CSS之去除li前面的小黑点,和ul、LI部分属性方法

    对于很多人用div来做网站时,总会用到,但在显示效果时前面总是会有一个小黑点,这个令很多人头痛,但又找不到要源,其它我们可以用以下方法来清除.1.在CSS中写入代码.找到相关性的CSS,在..li和. ...