博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过例子学习Lua(6)--C/C++中用Lua函数(转)
阅读量:2450 次
发布时间:2019-05-10

本文共 2716 字,大约阅读时间需要 9 分钟。

通过例子学习Lua(6)--C/C++中用Lua函数(转)[@more@]

  
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

  

  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++来调用下试试

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-951600/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-951600/

你可能感兴趣的文章
firebase使用_如何使用ReactJS和Firebase构建TodoApp
查看>>
nsfw_如何使用机器学习设置NSFW内容检测
查看>>
react中使用构建缓存_如何使用React构建客户支持实时聊天小部件
查看>>
reactjs生命周期_如何在ReactJS中了解组件的生命周期方法
查看>>
graphql和rest_如何使用GraphQL使您的网站整洁和可维护
查看>>
flutter dart_Dart和Flutter的简化介绍
查看>>
hbuilder自述文件_为什么创建自述文件已成为我最喜欢的开发部分
查看>>
从ES5到ESNext-这是自2015年以来添加到JavaScript的所有功能
查看>>
GraphQL中的突变简介:它们是什么以及如何使用它们
查看>>
计算机编程课程顺序_550月份提供免费的在线编程和计算机科学课程
查看>>
哈希编码学习方法_想学习编码吗? 这很容易。 这是解决困难部分的方法。
查看>>
python基础知识教程_通过此深入的视频课程学习Python基础知识
查看>>
idea构建web工程_如何使用系统工程来构建成功的Web应用程序
查看>>
桌面应用程序 架构_关于该架构的全部内容:探索不同的架构模式以及如何在您的应用程序中使用它们
查看>>
自学区块链应用开发_我用来自学区块链开发的资源
查看>>
测试程序使用什么语言编写好_为未来的自我编写测试如何使您的测试更好
查看>>
浙江省高考志愿填报志愿文档_成为freeCodeCamp的志愿者编辑的一年如何改变了我的生活
查看>>
批量删除推文_如何批量(免费)删除过去的推文,以及如何摆脱过去的自我
查看>>
Elasticsearch初学者教程
查看>>
初学者应该学c++与c#_面向初学者的完整C#课程
查看>>