【20090930】C++培训日记-Lua
在C++中使用Lua,需要导入lua的头文件(lua.h、lualib.h、lauxlib.h),使用lua的lib。这里使用的是5.1版本。
由于lua是用C编写的,因此导入头文件时需要声明extern "C",让h文件用C编译。
- C++中调用Lua的函数:
先写一个Lua脚本Cal.lua,完成两个数相加的方法add:-
function add(x, y)
-
return x + y
-
end
-
//////////////////////////////////////////////////////////////////////////
-
// CopyRight(c) 2009, YOYO, All Rights Reserved.
-
// Author: LIN YiQian
-
// Created: 2009/09/30
-
// Describe: C++中调用Lua脚本
-
//////////////////////////////////////////////////////////////////////////
-
extern "C"
-
{
-
#include "lua.h"
-
#include "lualib.h"
-
#include "lauxlib.h"
-
};
-
-
#include <iostream>
-
-
#pragma comment(lib, "lua51.lib")
-
-
lua_State* g_pLuaState;
-
-
/************************************************************************/
-
/* 使用Lua脚本中的Add函数
-
/************************************************************************/
-
int lua_add(int nNum1, int nNum2)
-
{
-
int sum = 0;
-
-
// 获得函数:注意大小写
-
lua_getglobal(g_pLuaState, "add");
-
-
// 传参
-
lua_pushnumber(g_pLuaState, nNum1);
-
lua_pushnumber(g_pLuaState, nNum2);
-
-
// 执行函数 同时说明参数个数
-
lua_call(g_pLuaState, 2, 1);
-
-
// 获得返回值
-
sum = (int)lua_tonumber(g_pLuaState, -1);
-
-
// 清栈
-
lua_pop(g_pLuaState, 1);
-
-
return sum;
-
}
-
-
int main(void)
-
{
-
// 初始化Lua
-
g_pLuaState = lua_open();
-
-
// 打开文件
-
luaL_dofile(g_pLuaState, "Cal.lua");
-
-
// 调用函数
-
int sum = lua_add(3, 5);
-
-
// 打印结果
-
std::cout << sum << std::endl;
-
-
// 关闭Lua
-
lua_close(g_pLuaState);
-
-
system("pause");
-
-
return 0;
-
}
-
- Lua中调用C++的函数:
C++中定义函数average,固定格式是static int 函数名(Lua_State* pLuaState),其中int返回值的意思是返回的参数个数。我们可以通过传入的Lua_State*来获得参数。
在运行lua脚本前向Lua注册该函数,再运行即可使用。详细看代码:
C++代码:-
//////////////////////////////////////////////////////////////////////////
-
// CopyRight(c) 2009, YOYO, All Rights Reserved.
-
// Author: LIN YiQian
-
// Created: 2009/09/30
-
// Describe: Lua中读取C++
-
//////////////////////////////////////////////////////////////////////////
-
#include <iostream>
-
-
extern"C" {
-
#include "lua.h"
-
#include "lualib.h"
-
#include "lauxlib.h"
-
};
-
-
#pragma comment(lib, "lua51.lib")
-
-
/************************************************************************/
-
/* 求平均数函数
-
/************************************************************************/
-
static int average(lua_State* pLuaState)
-
{
-
// 获得参数个数
-
int n = lua_gettop(pLuaState);
-
-
double sum = 0;
-
-
// 从1开始读取第一个参数...
-
for (int i = 1; i <= n; ++i)
-
{
-
sum += lua_tonumber(pLuaState, i);
-
}
-
-
double avg = sum / n;
-
-
// 放入参数1:平均数
-
lua_pushnumber(pLuaState, avg);
-
-
// 放入参数2:和
-
lua_pushnumber(pLuaState, sum);
-
-
// 返回参数个数
-
return 2;
-
}
-
-
int main(void)
-
{
-
lua_State* pLuaState = lua_open();
-
-
// 打开Lua Base库
-
luaopen_base(pLuaState);
-
-
// 注册C++函数average
-
lua_register(pLuaState, "average", average);
-
-
// 运行脚本
-
luaL_dofile(pLuaState, "test.lua");
-
-
lua_close(pLuaState);
-
-
system("pause");
-
-
return 0;
-
}
-
print(3, 2, 1, 5, 4)
-
avg, sum = average(3, 2, 1, 5, 4)
-
print("Average = " , avg, "\nSum = ", sum)
-
print(5, 6, 7, 8, 9, 10, 11)
-
avg, sum = average(5, 6, 7, 8, 9, 10, 11)
-
print("Average = " , avg, "\nSum = ", sum)
-
- Lua中调用C++的成员函数:
由于要调用C++函数已经固定了格式为static int 函数名(LuaState* pLuaState),而成员函数显然不能这样写,于是我们使用LuaPlus,它是Lua For C++的扩展。
载一个LuaPlus,用release编译工程会在../../lib/win32与../../Bin目录生成LuaPlus_1100.lib和LuaPlus_1100.dll,放到项目目录下,
设置include目录是luaplus的Src/LuaPlus,即配置完成。
C++类如往常写法,在运行脚本前要注册该函数,使用你已经创建好的对象:-
//////////////////////////////////////////////////////////////////////////
-
// CopyRight(c) 2009, YOYO, All Rights Reserved.
-
// Author: LIN YiQian
-
// Created: 2009/09/30
-
// Describe: LuaPlus调用C++成员函数
-
//////////////////////////////////////////////////////////////////////////
-
#include <iostream>
-
-
#include "LuaPlus/LuaPlus.h"
-
#include "LuaPlus/LuaState.h"
-
-
#pragma comment(lib, "Lib/LuaPlus_1100.lib")
-
-
void speak(const char* msg)
-
{
-
std::cout << msg << std::endl;
-
}
-
-
class CTest
-
{
-
public:
-
void speakMember(const char* msg)
-
{
-
std::cout << msg << std::endl;
-
}
-
-
virtual void speakVirtual(const char* nick, const char* msg)
-
{
-
std::cout << nick << ": " << msg << std::endl;
-
}
-
-
};
-
-
int main(void)
-
{
-
LuaState* pLuaState = LuaState::Create();
-
LuaObject luaObj = pLuaState->GetGlobals();
-
-
// 注册全局函数
-
luaObj.RegisterDirect("speak", speak);
-
-
// 注册成员函数
-
CTest objTest;
-
luaObj.RegisterDirect("speakMember", objTest, &CTest::speakMember);
-
luaObj.RegisterDirect("speakVirtual", objTest, &CTest::speakVirtual);
-
-
// 运行脚本
-
pLuaState->DoFile("test.lua");
-
-
LuaState::Destroy(pLuaState);
-
-
system("pause");
-
-
return 0;
-
}
-
speak("hi")
-
speakMember("hello world")
-
speakVirtual("YOYO", "Test Success!")
-
- 无匹配