• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua和C++语言的交互详解

Lua和C++语言的交互详解

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了lua调用c++,c++ lua,lua源码详解与应用,lua 详解,lua与c#交互等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

写过Windows程序的人都知道,对于应用程序,如果需要在本地保存一些配置信息,我们经常将这些配置信息写在注册表或者本地的配置文件中,很多应用都是将一些配置信息写在配置文件中,比如以ini结尾的文件,这种配置文件很多,使用的很广泛,然后应用程序在启动的时候,就会解析这个配置文件,读取一些配置信息。

Lua的一项重要用途就是作为一种配置语言。而这篇文章将结合Lua来扩展应用程序,这种方式提供了更大的灵活性和便利性。

这篇博文主要总结的是使用C++和Lua进行交互,涉及到获取Lua中普通变量的值,Lua中table的值和调用Lua中的函数。下面就开始吧。

从一个最简单的例子开始

一个GUI程序,从配置文件读取窗口的大小,从而实现设置窗口的大小。下面我就写一个基于MFC的窗体程序来完成这个功能。点击这里去下载完成代码工程。我把重点的代码贴出来:
bool CLuaConfig::LoadConfig()
{
    L = luaL_newstate();
    if (!L)
    {
        return false;
    }
 
    // 加载配置文件
    int bRet = luaL_loadfile(L, pConfigFile);
    if (bRet)
    {
        return false;
    }
    // 运行配置文件
    bRet = lua_pcall(L, 0, 0, 0);
    if (bRet)
    {
        return false;
    }
 
    // 读取高
    lua_getglobal(L, "width");
    lua_getglobal(L, "height");
 
    // width
    if (!lua_isnumber(L, -2))
    {
        return false;
    }
 
    // height
    if (!lua_isnumber(L, -1))
    {
        return false;
    }
    iWindowHeight = lua_tointeger(L, -1);
    iWindowWidth = lua_tointeger(L, -2);
    return true;
}
</div>

luaL_newstate就不说了,用烂了;luaL_loadfile用于加载一个lua文件,然后调用lua_pcall运行编译好的程序块,lua_pcall是在保护模式下运行Lua代码,也就是说,出错了,lua_pcall会返回一个错误代码,并不会直接crash。当运行完程序块后,调用了两次lua_getglobal函数,这个函数会将全局变量值压入栈中,所以,width的值在索引为-2的位置,height的值在索引为-1的位置;接下来,就不用多说了。就是这样。下载程序,运行一下,就OK了,修改代码文件夹下的config.lua文件,看看运行结果。源代码这里下载。

table操作

在Lua中,对于table这种bug一样存在的东西,如果C API无法操作table,那我们还能不能愉快的玩耍了。让我们来看看C API如何操作table。现在有如下Lua语句:
background = {r = 0.3, g = 1, b = 0.5}
</div>

那么,C API如何读取这段代码,将其中的每个字段都解析出来呢。我先把代码贴上来,然后一句一句的分析:
// 读取全局的数据到栈中
lua_getglobal(L, "background");
if (!lua_istable(L, -1))
{
    // 如果不是table,就显示错误信息
    cout << "It's not a table." << endl;
    return 0;
}
 
// 读取table中字段的值,将值压入栈中
lua_getfield(L, -1, "r");
 
// 读取栈中的值
if (!lua_isnumber(L, -1))
{
    // 如果不是实数,就显示错误信息
    cout << "It's not a number." << endl;
    return 0;
}
 
double fValue = lua_tonumber(L, -1);
cout << "r => " << fValue << endl;
</div>

原谅我省略了luaL_newstate这样的代码。好了,读取一个table,同读取一个全局的变量是一个道理的。分为以下几步:

1.使用lua_getglobal读取这个变量,将table读取到栈中;
2.使用lua_getfield读取table中字段的值,将字段的值读取到栈中;
3.使用lua_to*系列函数,将字段的值从栈中读取出来。

这是读取table的操作,那设置table的操作呢?我们可以将我们自己的值写入到栈中,这该怎么操作?看代码:
// 将需要设置的值设置到栈中
lua_pushnumber(L, 0.55);
 
// 将这个值设置到table中
lua_setfield(L, -2, "r");
</div>

就是上面两行代码,当然了,你也需要先使用lua_getglobal读取table变量,将table读取到栈中,然后按照上面的两行代码进行设置就OK了。上面两行代码的具体含义是什么呢?

1.lua_push*系列函数是将一个需要设置的新值放到栈中;

2.lua_setfield函数同lua_getfield是一个性质的函数,只不过这里是set语义,将lua_push*到栈中的值,设置到table对应的key中。

现在读取table,设置table都说了,那如何在表中完全创建一个新的table呢?我们有这种需求。怎么办?

// 创建一个新的table,并压入栈
lua_newtable(L);
 
// 往table中设置值
lua_pushstring(L, "http://www.jb51.net"); // 先将值压入栈
lua_setfield(L, -2, "website"); // 将值设置到table中
 
// 再设置一个值
lua_pushstring(L, "果冻想 | 一个原创文章分享网站");
lua_setfield(L, -2, "description");
</div>

我将重要的几行代码贴上来了,最重要的就是一个lua_newtable函数,该函数会创建一个新的table,并将这个table置于栈中,接下来就和上面设置table的值是一样的。源代码下载一、下载二。 

调用Lua函数

是的,你没有看错,你可以在一lua文件中定义一个函数,然后在C++中调用这个函数,貌似“高大上”的感觉。现在我就来说说这个“高大上”的功能;习惯性的上代码:

// 再来看看有参数和返回值得函数调用
// 现在在test.lua中定义了一个add函数,计算两个值的和,这两个值就是用参数传进去的
// 得到和以后,会返回这个和,现在我们就在C++这边调用这个add函数
lua_getglobal(L, "add"); // 获取函数,压入栈中
lua_pushnumber(L, 10); // 压入第一个参数
lua_pushnumber(L, 20); // 压入第二个参数
 
// 完成调用
iRet = lua_pcall(L, 2, 1, 0);
if (iRet)
{
    const char *pErrorMsg = lua_tostring(L, -1);
    cout << pErrorMsg << endl;

您可能想查找下面的文章:

  • Lua中调用C++函数示例
  • C++中调用Lua配置文件和响应函数示例
  • 使用Lua来扩展C++程序的方法
  • Lua的table库函数insert、remove、concat、sort详细介绍
  • C++遍历Lua table的方法实例
  • 把Lua函数传递到C/C++中实例
  • Lua和C++语言的交互详解

相关文章

  • Lua教程(四):函数详解
  • Lua时间转化的几个小例子
  • Ruby元编程技术详解(Ruby Metaprogramming techniques)
  • Lua面向对象之类和继承浅析
  • Lua的table库函数insert、remove、concat、sort详细介绍
  • Lua脚本语言入门笔记
  • Lua 操作 MongoDB 数据库实例
  • LUA中的闭包(closure)浅析
  • Lua中table库函数方法介绍
  • Lua教程(十五):输入输出库(I/O库)

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中的持久化和序列化详解
    • Lua中数字for循环实例
    • Lua教程(七):数据结构详解
    • Lua极简入门指南(一):函数篇
    • Lua中的loadfile、dofile、require详解
    • Lua中类的实现原理探讨(Lua中实现类的方法)
    • Lua下基本的网络编程示例
    • Openresty服务器使用lua脚本写的Hello World简单实例
    • Lua读取和写入文件处理例子
    • Lua中让回调函数支持回调对象方法的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有