Lua学习笔记(6) : 在Lua中调用C++之函数
1. 前言
此前介绍过如何使用C++调用Lua中的函数,并给出了具体的代码,
在这篇教程中将介绍于Lua内调用C++函数的方法~
我们先来看代码,再讲述重点部分。
2. 代码
[C++程序]
#include "includelua.h" #include "includelauxlib.h" #include "includelualib.h" #include "windows.h" static int func(lua_State *pLua) { int num1=0, num2=0, result1=0, result2=0; // TODO 1: 取得Lua函数参数 if(lua_isnumber(pLua, 1)!=0) // 判断堆栈中的值是否为我们要的数字型态的值,若返回非0则正確 { num1 = (int)lua_tonumber(pLua, 1); // 取出堆栈中的Lua函数第1个参数值 } if(lua_isnumber(pLua, 2)!=0) // 判断堆栈中的值是否为我们要的数字型态的值,若返回非0则正確 { num2 = (int)lua_tonumber(pLua, 2); // 取出堆栈中的Lua函数第2个参数值 } // TODO 2: 逻辑处理 result1 = num1 + num2; // 得到结果1 result2 = num1 * num2; // 得到结果2 // TODO 3: 返回结果 lua_pushnumber(pLua, result1); // 将函数的第1个返回值推入堆栈中 lua_pushnumber(pLua, result2); // 将函数的第2个返回值推入堆栈中 return 2; // 返回整数2,表示此函数在Lua中有两个返回值 } void main(int argc, char* argv[]) { lua_State *pLua = luaL_newstate(); // Lua5.2后的版本遗弃lua_open(),改用luaL_newstate() if(!pLua) { printf("Failed to open Lua. "); return; } luaL_openlibs(pLua); // Lua5.1以上使用此函数开启库 lua_register(pLua, "func", func); // 調用此宏可將C++的函數註冊給Lua使用 if(luaL_dofile(pLua, "luaDemo.lua")!=0) // 执行Lua腳本,若返回0则成功 { printf("Failed to run lua. "); return; } lua_close(pLua); system("pause"); return; }
[Lua程序]
r1, r2 = func(3, 4) print(math.floor(r1).." "..math.floor(r2))
3. 代码实现重点
重点一:
首先,想要在Lua中调用C++函数的话,必须让C++程序在开始执行Lua脚本前,先行注册所有可供调用的函数給Lua。
第43行的 lua_register 这个宏可以把C++函数注册给Lua调用,
lua_register 的第二个参数表示在Lua中所调用的函数名称,第三个参数则是欲调用的C++函数之名称。
重点二:
可供Lua调用的C++函数必须为静态(static)函数或全局(global)函数。
换句话说,就是该函数必须要拥有与C++主程序相同的生命周期,否则Lua程序将无法调用到该函数。
重点三:
关于Lua所調用之C++函数参数的载入,以及返回值的处理请参照代码的 TODO 1、TODO 2、TODO 3
按照这样的顺序运行即可实现基本的函数运行架构。
4. Output
7 12