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
