阅读本篇文章之前,请先阅读 lua入门级这篇文章,了解C++与lua之间是通过栈来交换数据的;

下面介绍几个后面会用到的函数:

C语言向栈写入或读取函数:

lua_push**(L,value);         //**表示数据类型  一般为nil number string ……

lua_to**(L,index)             //index  位置索引

C中执行lua函数的相关函数:

lua_getglobal(L,"var")会执行两步操作:

    1.将var放入栈中

    2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。

lua_pcall(L,2,1,0);  这句话是执行lua中的函数 的函数,

    L:当前环境;2:函数中参数的个数;1:函数的返回值的个数;0:一般这个参数都是0,这样如果lua函数执行遇见问题时,错误信息将被压入栈中;

    函数的返回值也将被写入栈中;

下面介绍一些基础的C++与lua交换的实例:

先上代码:test.lua

lua  与C++交互_入栈lua  与C++交互_c++_02
function run()
    print("call from c")
    print(clib())
end

function add(a,b)
    print("run fun add")
    return a+b
end
View Code

C++:

lua  与C++交互_入栈lua  与C++交互_c++_02
// lua_c.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <iostream>
extern "C"{
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
    #include <lua.hpp>
}
using namespace std;

#pragma comment(lib,"lua5.1.lib")  
#pragma comment(lib,"lua51.lib")  
lua_State *L;

//被lua调用的C函数必须定义为 static int xxx(lua_State *L) 的形式
static int clib(lua_State *L)
{
    lua_pushnumber(L,1234);
    return 1;                   //返回1 也是有依据的 因为该函数将1个值压入了栈,lua要从里面取出一个值
}

int main(int argc, char* argv[])
{
    int sum;
    //创建一个指向lua解释器的指针
    L=luaL_newstate();
    //加载lua标准库
    luaL_openlibs(L);
    //注册C++函数
    lua_register(L,"clib",clib);
    //加载脚本
    luaL_dofile(L,"test.lua");
    //调用函数
    lua_getglobal(L,"run");
    lua_pcall(L,0,0,0);
    //运行函数并把结果压入栈
    lua_getglobal(L,"add");
    lua_pushnumber(L,2);
    lua_pushnumber(L,5);
    lua_pcall(L,2,1,0);
    sum = (int)lua_tonumber(L, -1);
    printf("%d\n",sum);
    //关闭并释放资源
    //测试C 读取lua中的元素
    lua_pushnumber(L,110);
    lua_pushstring(L,"hi,panteng");
    string name=(string)lua_tostring(L,-1);
    int age=(int)lua_tonumber(L,-2);
    cout<<name<<"的年龄是:"<<age<<endl;

    lua_close(L);
    printf("Hello World!\n");
    return 0;
}
View Code

首先叙述C++嵌入lua脚本初始化的一些东西:

     //创建一个指向lua解释器的指针
     L=luaL_newstate();
     //加载lua标准库
     luaL_openlibs(L);

    //加载脚本
     luaL_dofile(L,"test.lua");

下面说调用lua函数的过程:

          /*------寻找函数-------*/

    lua_getglobal(L,"add");  //首先将“run”放到栈顶;  然后寻找 run的值 ; 用run的值替换"run"

          /*------参数赋值-------*/

    lua_pushnumber(L,2);
    lua_pushnumber(L,5);

          /*------调用函数-------*/

    lua_pcall(L,2,1,0);

          /*------取返回值-------*/

    int  sum = (int)lua_tonumber(L, -1);

 下面说lua调用C++中函数的过程:

    //在C++中,注册C++函数
     lua_register(L,"clib",clib);  //建议C++中与lua中的函数名保持一致  不一致的话会不会出问题就不知道了 没有测试过

  然后在lua中调用即可

 

-----后续还有一些关闭L的语句,关闭之前也应该先pop出栈中的数据,这一部分还没搞的太明白,待续……