通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*、lua_is*、lua_to*等等。用C++调用Lua数据时,我们主要运用lua_getglobal与lua_push*配合以达到目的。现在我们来试试用Lua调用C++数据。

C++数据类型映射到Lua

C++中数据类型有这么几种:1、内建的int、float等;2、指针,如void *、int *、int (*fun)(int, int)等;3、用户自定义的class、strcut等。Lua中C API支持操作的数据类型有如下:

C++与Lua交互(四)

见名知意,从他们的参数,我们就可以看出来他们的作用。比如:lua_pushlightuserdata用来将指针压栈,lua_pushcclosure用来将函数压栈,不一而足。通过这些API,我们可以将C++中的数据结构一一映射到Lua中。

Lua调用C++内置常用数据类型与函数

我们要将一个值,从C++传入Lua,必须有两个步骤:1、值是多少?通过lua_push*将值压入栈顶,此时该值的类型与值的大小已确定;2、用什么名字来引用该值?通过lua_setglobal来用一个名字引用栈顶的值。我们来按照这个步骤,尝试一下将一个变量传入Lua,代码如下:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
extern "C"
{
 
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
};
 
void TestLua2();
int main()
{
    TestLua2();
    return 0;
}
 
void TestLua2()
{
    lua_State *L = luaL_newstate();
    luaopen_base(L); //
    luaopen_table(L); //
    luaopen_package(L); //
    luaopen_io(L); //
    luaopen_string(L); //
    luaL_openlibs(L); //打开以上所有的lib
    
    int valueCPP = 1;
 
    // 将a值压入栈顶
    lua_pushnumber(L, valueCPP);
    // 命名栈顶的值
    lua_setglobal(L, "valueCPP");
 
    string str;
    while (true)
    {
        cout << "输入lua文件路径:" << endl;
        getline(cin, str, '\n');
        if (luaL_loadfile(L, str.c_str())
            || lua_pcall(L, 0, 0, 0) )
        {
            const char * error = lua_tostring(L, -1) ;
            cout << string(error) << endl;
        }
    }
 
}

相关文章: