• 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)。

    1. // LuaScriptParse.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include
    4. #include
    5. extern "C" {
    6. #include "Lua542/include/lua.h"
    7. #include "Lua542/include/lualib.h"
    8. #include "Lua542/include/lauxlib.h"
    9. }
    10. #pragma comment(lib,"Lua542/lua54.lib")
    11. bool CheckLua(lua_State* L, int r) {
    12. if (r!=LUA_OK) {
    13. std::string errormsg = lua_tostring(L,-1);
    14. std::cout << errormsg << std::endl;
    15. return false;
    16. }
    17. return true;
    18. }
    19. ///
    20. /// 被注册到LUA的函数
    21. ///
    22. /// lua虚拟机
    23. /// 传入参数个数
    24. int lua_HostFunction(lua_State* L) {
    25. float a = (float)lua_tonumber(L, 1);
    26. float b = (float)lua_tonumber(L, 2);
    27. std::cout << "[C++] lua_HostFunction(" << a << "," << b << ")" << std::endl;
    28. float c = a * b;
    29. lua_pushnumber(L, c);
    30. return 1;
    31. }
    32. int main()
    33. {
    34. std::string cmd = "a= 7 + 11 + math.sin(23.7)";
    35. //创建虚拟机(状态栈)
    36. lua_State* L = luaL_newstate();
    37. luaL_openlibs(L);
    38. if (CheckLua(L, luaL_dostring(L, cmd.c_str()))) {
    39. //获取全局变量,结果放在栈顶
    40. lua_getglobal(L, "a");
    41. //判断栈顶数据是否是个数字
    42. if (lua_isnumber(L,-1)) {
    43. float a_in_cpp = (float)lua_tonumber(L,-1);
    44. std::cout << "a_in_cpp = " << a_in_cpp << std::endl;
    45. }
    46. }
    47. //注册一个函数
    48. lua_register(L,"HostFunction", lua_HostFunction);
    49. //加载文件
    50. if (CheckLua(L, luaL_dofile(L, "./Example.lua"))) {
    51. //获取一个全局变量
    52. lua_getglobal(L, "DoAThing");
    53. //判断栈顶是否是函数
    54. if (lua_isfunction(L,-1)) {
    55. //压入参数
    56. lua_pushnumber(L,5.0f);
    57. lua_pushnumber(L, 6.0f);
    58. //调用函数,指明输入、输出参数个数,错误相应
    59. if (CheckLua(L,lua_pcall(L,2,1,0))) {
    60. std::cout << "[C++] Called in lua 'DoAthing(5.0f,6.0f)',got "
    61. << (float)lua_tonumber(L, -1) << std::endl;
    62. }
    63. }
    64. }
    65. //关闭虚拟机
    66. lua_close(L);
    67. }

  • 相关阅读:
    JQuery
    Linux——基础网络设置
    《永恒空间2》v1.1.36252中文版
    Qt在工控行业的一些重点知识点
    Linux 下 SSH 登录如何显示横幅消息
    HBase2.x(二)HBase安装部署
    【17】Java常见的面试题汇总(设计模式)
    系统集成|第二十一章(笔记)
    Matlab:合并来自各自变量的日期和时间
    跟运维学 Linux - 02
  • 原文地址:https://blog.csdn.net/lifei_0001/article/details/134369257