通过前几篇,我们已经对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支持操作的数据类型有如下:
image
见名知意,从他们的参数,我们就可以看出来他们的作用。比如:lua_pushlightuserdata用来将指针压栈,lua_pushcclosure用来将函数压栈,不一而足。通过这些API,我们可以将C++中的数据结构一一映射到Lua中。
Lua调用C++内置常用数据类型与函数
我们要将一个值,从C++传入Lua,必须有两个步骤:1、值是多少?通过lua_push*将值压入栈顶,此时该值的类型与值的大小已确定;2、用什么名字来引用该值?通过lua_setglobal来用一个名字引用栈顶的值。我们来按照这个步骤,尝试一下将一个变量传入Lua,代码如下:
#include
#include
#include
using namespace std;
extern "C"
{
#include
#include
#include
};
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;
}
}