1、首先说下目的,为什么要这么做 ?

   在此之前,如果不知道C和lua怎么进行数据交互的童鞋,请移步另一篇文章《Linux下C/C++和lua交互-Table》。

正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑;所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果。

 2、具体怎么做?

一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境、用操作栈的规则和lua交互数据或参数(调用lua函数);执行所需操作或是取得所需数据后销毁lua环境。以下用源码进行详细解释:

  ①、C++源文件

     //1、包含头文件
extern "C"
{
#include<lua5./lua.h>
#include<lua5./lauxlib.h>
#include<lua5./lualib.h>
}
//2、创建lua环境
lua_State *L = luaL_newstate();
if(L == NULL)
{
cout<<"Creat Lua State Error !"<<endl;
return ;
}
//如需在终端输出打印信息,库是必须加载的,否则看不到lua的print信息
luaL_openlibs(L);
//3、加载lua脚本
const string lua_path = "../scripts/";
const string file = "Function.lua";
string script = lua_path + file ;
int ret = luaL_dofile(L ,script.c_str());
if(ret)
{
cout<<"Lua doFile Error !"<<endl;
return ;
}
//4、调用脚本中已写好的函数
//a、无参函数
lua_getglobal(L, "ruler"); //函数名为ruler
lua_pcall(L,,,); //用保护模式调用lua函数,入参个数为0、出参个数为0、无自定义错误处理 //b、有参函数
lua_getglobal(L, "add"); //函数名为add
lua_pushnumber(L, number1); //第一个入参
lua_pushnumber(L, number2); //第二个入参
lua_pcall(L,,,); //函数有两个入参,一个出参,所以函数形式为add(a,b)
//5、获得返回值,单回值情况下调用完成后lua会把结果放到栈顶,多返回值时,按照规则存放,具体查API
if(lua_isnumber(L,-))
{
cout<<"the result is :"<<lua_tonumber(L,-)<<endl;
}
//6、销毁lua环境
lua_close(L);

  ②、lua脚本

 //、add,lua脚本内容
function add(a,b)
return a+b;
end function ruler()
print("this is some thing need to tell you !!!");
end

3、结语:

总之,lua和C/C++交互必须依靠媒介——栈;用lua作为配置文件时,内容为静态的,组织为table,C++通过table相关接口操作数据;当用lua作为较为复杂的函数语言时,当前lua中所有全局函数都可以被宿主语言调用,且如果要用lua输出打印信息以便调试,此时必须open lua库,否则将看不到print相关内容,且全局的print都会导致difile()失败。

典型操作就这两类,其余的,都可以通过查阅API手册尝试去使用,have fun !

简述C/C++调用lua中实现的自定义函数的更多相关文章

  1. ulua c#调用lua中模拟的类成员函数

    项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,2 ...

  2. C调用lua的table里面的函数

    网上搜索C.C++调用lua函数,有一大堆复制粘贴的. 但是搜索<C调用lua的table里面的函数> 怎么就没几个呢? 经过探索,发现其实逻辑是这样的: 1.根据name获取table ...

  3. 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv

    152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...

  4. java中调用数据库中的存储过程和函数

    public static void main(String[] args)    {         Connection conn =getConnection(url,user, pwd);   ...

  5. SQL中存储过程和自定义函数的区别

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  6. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  7. C调用Lua中的函数解析table

    Passing Tables to Lua Functions A use case that happens often is the passing of tables to and from L ...

  8. FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量

    注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...

  9. C++调用C中编译过的函数要加extern "C"

    C++语言支持函数重载,C语言不支持函数重载.函数被C++编译后在库中的名字与C语言的不同.假设某个C 函数的声明如下:void foo(int x, int y);该函数被C 编译器编译后在库中的名 ...

随机推荐

  1. 【html】 a 标签

    摘要 嗷呜,发现好多前端细节,基础不扎实啊,喵了个咪 target 属性 在制定框架中打开 <a href="a.html" target="view_frame& ...

  2. iOS耗电量测试

    iOS耗电量测试 本文主要介绍的是使用Energy Diagnostics Instruments来进行iOS耗电量测试. 一.使用方法: 1)iOS 设置选项 ->开发者选项 ->log ...

  3. RobotFramework自动化测试框架的基础关键字(四)

    1.1.1        如何使用for循环 不管在哪种编程语言中,for循环都是必不可少的,在Robot Framework中,我们也可以使用for循环来做遍历处理. 我们用for循环对一个列表进行 ...

  4. Python之系统交互(subprocess)

    本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell ...

  5. mac上安装kali2.0 pdtools

    备注下: 操作--安装parallers tools 弹出cdrom 将其复制到一个文件夹 然后运行./install 会提示权限不够,执行chmod -R 777 . 再执行安装 会开始下载缺少的库 ...

  6. gitbook初体验

    前言 在早些天看sec-wiki的时候,看到有同学做了一个ctf-wiki来介绍CTF,让CTF新手能够快速入门,做成了电子书的样子,放在github上面.页面精美.简洁,让人爱不惜手. 想着自己也能 ...

  7. Hibernate_01

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  8. 在实现从excel中读取数据作为接口参数遇到的问题

    这个算我自己第一次使用python语言实现 一个功能 一.首先我们先要代码实现如何从excel上读取数据python实现还是比较简单的 1.我使用的是xlrd模块,我们先要安装这个包,这样我们才可以使 ...

  9. .NET并行计算和并发2-Foreground and Background Threads

    后台线程不会使托管执行环境处于运行状态,除此之外,后台线程与前台线程是一样的. 一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭.

  10. Qt控件窗体区域区分

    控件窗体区域区分几何参数: 指的是窗口的大小和位置,一个窗口有两套几何参数,一套是窗口外边框所占的矩形区域,另一套是窗口客户区所占的矩形区域,所谓窗口客户区就是窗口中除去边框和标题栏用来显示内容的区域 ...