C/C++内嵌简本语言-LUA

一、LUA简介

Lua 1 是一个小巧的脚本语言。Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 2 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 2 一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 2

二、内嵌LUA

LUA的核心是lua_State结构体。他是lua脚本(或者解析器)与C++语言数据传输的媒介。lus_State可以理解为是一个栈。数据的传入传出都是通过栈来操作。栈从上往下索引是(-1,-2,...),从下往上是(0,1,2,3)。

cpp 复制代码
// LuaScriptParse.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>

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


#pragma comment(lib,"Lua542/lua54.lib")


bool CheckLua(lua_State* L, int r) {
    if (r!=LUA_OK) {
        std::string errormsg = lua_tostring(L,-1);
        std::cout << errormsg << std::endl;
        return false;
    }
    return true;
}

/// <summary>
/// 被注册到LUA的函数
/// </summary>
/// <param name="L">lua虚拟机</param>
/// <returns>传入参数个数</returns>
int lua_HostFunction(lua_State* L) {
    float a = (float)lua_tonumber(L, 1);
    float b = (float)lua_tonumber(L, 2);

    std::cout << "[C++] lua_HostFunction(" << a << "," << b << ")" << std::endl;

    float c = a * b;
    lua_pushnumber(L, c);
    return 1;
}


int main()
{
    std::string cmd = "a= 7 + 11 + math.sin(23.7)";
    //创建虚拟机(状态栈)
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    if (CheckLua(L, luaL_dostring(L, cmd.c_str()))) {
        //获取全局变量,结果放在栈顶
        lua_getglobal(L, "a");
        //判断栈顶数据是否是个数字
        if (lua_isnumber(L,-1)) {
            float a_in_cpp = (float)lua_tonumber(L,-1);
            std::cout << "a_in_cpp = " << a_in_cpp << std::endl;
        }
    }

    //注册一个函数
    lua_register(L,"HostFunction", lua_HostFunction);
    //加载文件
    if (CheckLua(L, luaL_dofile(L, "./Example.lua"))) {
        //获取一个全局变量
        lua_getglobal(L, "DoAThing");
        //判断栈顶是否是函数
        if (lua_isfunction(L,-1)) {
            //压入参数
            lua_pushnumber(L,5.0f);
            lua_pushnumber(L, 6.0f);

            //调用函数,指明输入、输出参数个数,错误相应
            if (CheckLua(L,lua_pcall(L,2,1,0))) {
                std::cout << "[C++] Called in lua 'DoAthing(5.0f,6.0f)',got "
                    << (float)lua_tonumber(L, -1) << std::endl;
            }
        }
    }

    //关闭虚拟机
    lua_close(L);
}
相关推荐
devilnumber7 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
asdfg12589639 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11019 小时前
JavaScript变量
开发语言·javascript·ecmascript
z落落10 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway210 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_4624462310 小时前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了10 小时前
安装git bash选项推荐
开发语言·git·bash
ct97810 小时前
React 状态管理方案深度对比
开发语言·前端·react
数量技术宅11 小时前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python
华如锦11 小时前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai