lua与C++相互调用

C++Lua的简单交互(1

 

以下演示环境基于VS2010平台。

1. 环境配置

先下载好Lua的库和头文件。

接着,新建Windows空的控制台项目。在项目属性里指定库路径和头文件路径。这里我直接把库文件放到了工程目录下面,而头文件路径我在程序里面使用了相对路径。

2. 添加一个myLuaScrip.lua文件,代码如下

lua.hpp中的代码

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

 ----------------------------------myLuaScrip.lua-----------------------------------------------

 print("Hello Kitty!!!")

 

function myFunction(a, b, c)       ------ 该函数演示参数的传递

print("in function abc")

print(a..b..'+'..c..'=')

return b+c

end

 

function luaAdd(num1, num2)

print("in luaAdd")

print(cplusplusAdd(num1,num2))   ------此处调用C++中定义的函数

print("exit luaAdd")

end

--------------------------------------------------------------------------------------------------

接着添加main.cpp文件,代码如下

----------------------------------------main.cpp-----------------------------------------------

extern "C" {

#include "..\lua\include\lua.hpp"

#pragma comment(lib"lua51.lib"

}

 

#include <iostream>

#include <string>

using namespace std;

 

int cplusplusAdd(lua_State *L) // 准备在lua中调用的函数

{

cout << "in cplusplusAdd" << endl;

int num1 = luaL_checknumber(L,1); // 读入传入的两个参数

int num2 = luaL_checknumber(L,2);

lua_pushnumber(L,num1+num2); // 返回结果

cout << "exit cplusplusAdd" << endl;

return 1;

}

 

int main(int argc , char* argv[])

{

lua_State *L = luaL_newstate();  //初始化Lua,创建一个解析器句柄。5.0以后版本建议采用

//等价于// lua_State *L = lua_open();

 

luaL_openlibs(L); // 载入所有Lua标准库

bool err = luaL_dofile(L,"myLuaScrip.lua"); // 加载文件

//等价于// bool err = luaL_loadfile(L,"myLuaScrip.lua") || lua_pcall(L,0,0,0);

 

if (err) // 载入文件发生错误

{

cerr << lua_tostring(L,-1) << endl; // 显示错误

lua_pop(L,1); // 弹出栈上的错误信息

}

 

///C++调用Lua///

lua_getglobal(L,"myFunction");

if (lua_isfunction(L,-1)) // 确认取到的是函数

{

lua_pushstring(L,"count:"); // 传入参数

lua_pushnumber(L,123); // 传入参数

lua_pushnumber(L,456); // 传入参数

if (lua_pcall(L,3,1,0)) // 是否调用函数发生异常。3代表3个参数,1代表1个返回值

{

cerr << lua_tostring(L,-1) << endl; // 打印错误信息

lua_pop(L,1);

}

else

{

cout << lua_tostring(L,-1) << endl; // 输出myFunction函数的返回结果

lua_pop(L,1); // 弹出结果

}

}

else

{

cerr << lua_tostring(L,-1) << endl;

lua_pop(L,1);

}

 

///Lua调用C++///

lua_pushcfunction(L,cplusplusAdd);

lua_setglobal(L,"cplusplusAdd");

lua_getglobal(L,"luaAdd");

if (lua_isfunction(L,-1))

{

lua_pushnumber(L,9); //  传入参数

lua_pushnumber(L,8);

if (lua_pcall(L,2,0,0)) 

{

cerr << lua_tostring(L,-1) << endl; // 打印错误信息

lua_pop(L,1);

}

}

else

{

cout << lua_tostring(L,-1) << endl;

lua_pop(L,1);

}

 

    lua_close(L); // 关闭

 

system("PAUSE");

return 0;

}

 

--------------------------------------------------------------------------------------------------

3. 执行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值