C中调用Lua函数

我们先来看一个简单的例子:

lua_State* L = NULL;

// 内部调用lua函数
double f(double x, double y)
{
    double z;
    lua_getglobal(L, "f");    // 获取lua函数f
    lua_pushnumber(L, x);    // 压入参数x和y
    lua_pushnumber(L, y);

    if(lua_pcall(L, 2, 1, 0) != 0)
        error(L, "error running function ‘f‘: %s", lua_tostring(L, -1));

    if(!lua_isnumber(L, -1))
        error(L, "function ‘f‘ must return a number");
    z = lua_tonumber(L, -1);
    lua_pop(L, 1);
    return z;
}

int main(void)
{
    L = lua_open();
    luaL_openlibs(L);

    if(luaL_loadfile(L, "c:\\luatest\\functest.lua") || lua_pcall(L, 0, 0, 0))
        error(L, "cannot run configuration file: %s", lua_tostring(L, -1));
    printf("%f\n", f(1.0, 2.0));

    return 0;
}

functest.lua:

f = function(a, b)
    return a + b
end

  这其中最关键的是调用函数的使用,在C中调用Lua函数的API主要由以下几个:

(1)void lua_call (lua_State *L, int nargs, int nresults);
  函数调用,nargs表示参数的个数,nresults表示返回值的个数
  首先将lua函数压栈,然后将参数依次压栈,最后调用函数即可
  函数调用时,参数和函数都会pop出栈,调用返回后,结果会push进栈
  nresults==LUA_MULTRET,所有的返回值都会push进栈
  nresults!=LUA_MULTRET,返回值个数根据nresults来调整
  Lua语句:
    a = f("how", t.x, 14)
  在C中的实现:
    lua_getglobal(L, "f");        // 函数入栈
    lua_pushstring(L, "how");      // 参数1入栈
    lua_getglobal(L, "t");       // 表t入栈
    lua_getfield(L, -1, "x");       // 参数2入栈
    lua_remove(L, -2);         // 跳t出栈
    lua_pushinteger(L, 14);     // 参数3入栈
    lua_call(L, 3, 1);            // 调用函数,参数和函数都会出栈
    lua_setglobal(L, "a");         // 给a赋值,栈顶出栈
  上述代码执行完毕后,堆栈状态恢复原样。

(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
  函数调用,在安全模式下,并且可以添加错误处理函数。
  如果调用期间发生error,lua_pcall会捕获之,然后push stack一个错误信息(会先将函数和参数pop出栈),并且返回一个error code(非0的一个值)。
  发生error时,如果指定了错误处理函数,会在error message入栈前调用错误处理函数,具体由msgh参数来决定:
  (1)msgh==0,不指定错误处理函数,入栈信息不变;
  (2)msgh!=0,msgh表示错误处理函数的堆栈index,错误处理函数会以error message为参数,并将返回的新的error message入栈。主要用来给error message添加  更多的debug信息,比如堆栈跟踪,因为这些信息在pcall调用完之后是收集不到的。
  函数返回代码:
  LUA_OK(0):调用成功
  LUA_ERRRUN:runtime error
  LUA_ERRMEM:内存分配错误,这种情况下不会调用错误处理函数
  LUA_ERRERR:调用错误处理函数时出错,当然,不会再进一步调用错误处理函数
  LUA_ERRGCMM:调用metamethod.__gc时报错,由gc引起,和函数本身没关系

(3)int lua_pcallk (lua_State *L,
          int nargs,
          int nresults,
          int errfunc,
          int ctx,
          lua_CFunction k);
  函数调用,在安全模式下,并且允许函数yield。

C中调用Lua函数,布布扣,bubuko.com

时间: 2024-12-28 01:45:34

C中调用Lua函数的相关文章

cocos2d-x 3.0 在C++中调用lua函数(2)

个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack { public: void call_script_fun(const char* fun) { exe

cocos2d-x 3.0 在C++中调用lua函数

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall =

在C\C++中调用Lua

1.C\C++程序中调用Lua函数 方法一: #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include "lua.hpp" const char* lua_function_code = "function dealStr(str) \   return string.gsub(str,\"Wo

Lua中调用C函数

Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int

Lua中调用C函数(lua-5.2.3)

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

C语言中调用Lua

C语言和Lua天生有两大隔阂: 一.C语言是静态数据类型,Lua是动态数据类型 二.C语言需要程序员管理内存,Lua自动管理内存 为了跨越世俗走到一起,肯定需要解决方案. 解决第一点看上去比较容易,C语言中有union. 可是第二点呢?万一C语言正引用着Lua的一个值,Lua自动释放了怎么办? 所以就有了一种比union更好的解决方案:栈. 这是一个虚拟的栈,是沟通两者的桥梁,两者的数据交换全都通过这个栈进行,这样只要不pop,Lua就不会自动释放,而什么时候pop由C语言说了算. 下面是一段喜

vs如何在C++中调用Lua

最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscript的应该很容易就能上手,那些Lua独有的特性也是比较有趣,例如不定数目的多参数函数和随意的参数返回值等. 这里想要吐槽一下最近用来学习Lua的书籍<XX开发实践指南>(虽然没有写全名不过搜索过Lua学习资料的童鞋应该都懂是哪本书),不知道是作者问题还是译者问题,有些地方的解释说明有点糟糕,要么不

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

c/c++中调用lua

本人最近学了lua,做点记录.. 要在c/c++中使用lua,当时首先是需要个lua的解析器啦...  从( http://www.lua.org/ ) 这个网站可以下到.本人是在这里下载的 lua5.3 的源码, 可以从 这个git库clone一份  本人的vs2013工程 ( https://git.oschina.net/liLinux/lua-5.3.git )..已经做好了设置,可以编译成静态库或者动态库都行. c中调用lua,很基础很简单.所以直接上代码 //callLua.lua