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


经验分享 程序员 微信小程序 职场和发展