在上一篇文章中(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. [Web Security] JSON Hijacking

    After reading the blog, the main take away from there is: "Never send back JOSN array to the cl ...

  2. Qt产生随机数(两种方法)

    第一种方法 #include <QTime> QTime time; time= QTime::currentTime(); qsrand(time.msec()+time.second( ...

  3. 学习Java必看书籍和步骤

    Java语言基础  谈到Java语言基础学习的书籍,大家肯定会推荐Bruce Eckel的<ThinkinginJava>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它 ...

  4. Android LoaderManager与CursorLoader用法

    一.基本概念 1.LoaderManager LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象. 每个Activity或者Fragme ...

  5. UVA 11489 - Integer Game 博弈

    看题传送门 题目大意: S和T在玩游戏,S先.给出一数字串,两人轮流取出一个数字,要求每次取完之后剩下的数为3的倍数,或者没有数字留下.如果两个人足够聪明,求胜利的一方. 思路: 我一开始竟然没有输C ...

  6. 2、应用程序及驱动-poll和select使用说明

    1.poll机制(如果中断机制出问题了,poll机制是对中断机制的补充,比如等一个小孩,如果小孩生病了,因此隔一段时间应该去找他) poll机制就是给定一段时间,在这一段时间内程序处于睡眠状态一直等待 ...

  7. keil出现蓝色小箭头

  8. Centos配置java环境

    安装jdk JDK 是开发Java程序必须安装的软件,我们查看一下 yum 源里面的 JDK:yum list java* 选择适合本机的JDK,并安装:yum install java-1.7.0- ...

  9. HDoj-1163- Digital Roots

    Problem Description The digital root of a positive integer is found by summing the digits of the int ...

  10. Linux与Windows 10用grub引导教程

    前言 去年暑假的时候,写了一篇如何装 Linux 和 Windows 10 双系统的文章发在了简书上,我写这篇文章的原因是当初装双系统确实是折腾了许久,网上也找不到一篇详尽的教程.由于去年对于写教程还 ...