通过例子学习Lua(6) ---- C/C++中用Lua函数

参考英文文档 http://tonyandpaige.com/tutorials/lua2.html

1.简介
偶们这次主要说说怎么由Lua定义函数,然后在C或者C++中调用. 这里偶们
暂不涉及C++的对象问题,只讨论调用函数的参数,返回值和全局变量的使用.

2.
这里偶们在e12.lua里先定义一个简单的add(),x,y为加法的两个参数,
return 直接返回相加后的结果.

例e12.lua
-- add two numbers
function add ( x,y )
return x + y
end

在前一次里,偶们说到 lua_dofile() 可以直接在C中执行lua文件. 因为偶们
这个程序里只定义了一个add()函数,所以程序执行后并不直接结果,效果相当
于在C中定义了一个函数一样.

Lua的函数可以有多个参数,也可以有多个返回值,这都是由栈(stack)实现的.
需要调用一个函数时,就把这个函数压入栈,然后顺序压入所有参数,然后用
lua_call()调用这个函数. 函数返回后,返回值也是存放在栈中. 这个过程和
汇编执行函数调用的过程是一样的.

例e13.cpp 是一个调用上面的Lua函数的例子
#include <stdio.h>

extern "C" { // 这是个C++程序,所以要extern "C",
  // 因为lua的头文件都是C格式的
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

/* the Lua interpreter */
lua_State* L;

int luaadd ( int x,int y )
{
int sum;

/* the function name */
lua_getglobal(L,"add");

/* the first argument */
lua_pushnumber(L,x);

/* the second argument */
lua_pushnumber(L,y);

/* call the function with 2
  arguments,return 1 result */
lua_call(L,2,1);

/* get the result */
sum = (int)lua_tonumber(L,-1);
lua_pop(L,1);

return sum;
}

int main ( int argc,char *argv[] )
{
int sum;

/* initialize Lua */
L = lua_open();

/* load Lua base libraries */
lua_baselibopen(L);

/* load the script */
lua_dofile(L,"e12.lua");

/* call the add function */
sum = luaadd( 10,15 );

/* print the result */
printf( "The sum is %d
",sum );

/* cleanup Lua */
lua_close(L);

return 0;
}

程序说明:
main中过程偶们上次已经说过了,所以这次只说说luaadd的过程
* 首先用lua_getglobal()把add函数压栈
* 然后用lua_pushnumber()依次把x,y压栈
* 然后调用lua_call(),并且告诉程序偶们有两个参数一个返回值
* 接着偶们从栈顶取回返回值,用lua_tonumber()
* 最后偶们用lua_pop()把返回值清掉

运行结果:
The sum is 25

编译方法
Linux下把程序存成e13.cpp
g++ e13.cpp -llua -llualib -o e13
./e13

VC下编译方法
* 首先建立一个空的Win32 Console Application Project
* 把e13.cpp加入工程中
* 点project setting,然后设置link选项,再加上lua.lib lualib.lib两个额外的库
* 最后编译

建立好的project可以在这里下载
VC http://tonyandpaige.com/tutorials/luaadd.zip
Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz 3.全局变量 上面偶们用到了lua_getglobal()但并没有详细讲,这里偶们再举两个小例子来说下全局变量 lua_getglobal()的作用就是把lua中全局变量的值压入栈 lua_getglobal(L,"z"); z = (int)lua_tonumber(L,1); lua_pop(L,1); 假设Lua程序中定义了一个全局变量z,这段小程序就是把z的值取出放入C的变量z中. 另外Lua中还有一个对应的函数lua_setglobal(),作用是用栈顶的值填充指定的全局变量 lua_pushnumber(L,10); lua_setglobal(L,"z"); 例如这段小程序就是把lua中的全局变量z设为10,如果lua中未定义z的话,就会自动创建一个 全局变量z并设为10. 4.试试看 自己写个函数用C/C++来调用下试试

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...