通过例子学习Lua(6) ---- C/C++中用Lua函数
发布时间:2020-12-14 22:28:57 所属栏目:大数据 来源:网络整理
导读:参考英文文档 http://tonyandpaige.com/tutorials/lua2.html 1.简介 偶们这次主要说说怎么由Lua定义函数,然后在C或者C++中调用. 这里偶们 暂不涉及C++的对象问题,只讨论调用函数的参数,返回值和全局变量的使用. 2. 这里偶们在e12.lua里先定义一个简单的add()
参考英文文档
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++来调用下试试 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |