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

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

通过例子学习Lua(5)--Lua与C的交互(转)[@more@]

  
1.简介

  

  Lua与C/C++结合是很紧密的, Lua与C++交互是建立在Lua与C的基础上的, 所

  以偶先从Lua与C讲起.

  

  正如第一讲所说, 运行Lua程序或者说调用Lua主要有两种方式:

  * 通过命令行执行"Lua"命令

  * 通过Lua的C库

  虽然此前偶们一直用第一种方式, 但偶要告诉你, 通过Lua的C库执行才是游戏中

  常用的方式.

  

  
2.Lua的C库

  

  Lua的C库可以做为Shared Library调用, 但一般开发游戏时会把Lua的所有源程序

  都包含在内, 并不把Lua编译成共享库的形式. 因为Lua程序只有100多K, 而且几乎

  可以在任何编译器下Clean Compile. 带Lua源程序的另一个好处时, 可以随时对Lua

  本身进行扩充, 增加偶们所需的功能.

  

  Lua的C库提供一系列API:

  * 管理全局变量

  * 管理tables

  * 调用函数

  * 定义新函数, 这也可以完全由C实现

  * 垃圾收集器Garbage collector, 虽然Lua可以自动进行, 但往往不是立即执行的,

   所以对实时性要求比较高的程序, 会自己调用垃圾收集器

  * 载入并执行Lua程序, 这也可以由Lua自身实现

  * 任何Lua可以实现的功能, 都可以通过Lua的C API实现, 这对于优化程序的运行速度

   有帮助. 经常调用的共用的Lua程序片断可以转成C程序, 以提高效率. 连Lua都是C写的

   还有什么C不能实现呢?

  

  
3.Lua与C集成的例子

  例e10.c

  /* A simple Lua interpreter. */

  #include

  #include

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

  char line[BUFSIZ];

  lua_State *L = lua_open(0);

  while (fgets(line, sizeof(line), stdin) != 0)

  lua_dostring(L, line);

  lua_close(L);

  return 0;

  }

  

  编译

  Linux/Cygwin

  * 先编译Lua, 并把头文件放入include路径

  * gcc e10.c -llua -llualib -o e10

  

  VC6/VC2003

  * 先编译Lua, 在Option中设置头文件和库文件路径

  * 新建工程,在工程配置中加入附加库lua.lib和lualib.lib

  * 编译成exe

  

  运行结果

  本程序的功能是实现一个Lua解释器, 输入的每行字符都会被解释成Lua并执行.

  

  程序说明

  * #include 包含lua头文件, 然后才可以使用API

  * lua_State *L = lua_open(0) 打开一个Lua执行器

  * fgets(line, sizeof(line), stdin) 从标准输入里读入一行

  * lua_dostring(L, line) 执行此行

  * lua_close(L) 关闭Lua执行器

  

  

  例e11.c

  /* Another simple Lua interpreter. */

  #include

  #include

  #include

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

  char line[BUFSIZ];

  lua_State *L = lua_open(0);

  lua_baselibopen(L);

  lua_iolibopen(L);

  lua_strlibopen(L);

  lua_mathlibopen(L);

  while (fgets(line, sizeof(line), stdin) != 0)

  lua_dostring(L, line);

  lua_close(L);

  return 0;

  }

  

  运行结果

  本程序的功能是实现一个Lua解释器, 输入的每行字符都会被解释成Lua并执行.

  与上例不同的是, 本例调用了Lua的一些标准库.

  

  程序说明

  * #include 包含Lua的标准库

  * 以下这几行是用来读入Lua的一些库, 这样偶们的Lua程序就可以有更多的功能.

  lua_baselibopen(L);

  lua_iolibopen(L);

  lua_strlibopen(L);

  lua_mathlibopen(L);

  

  
4.试试看

  把上面两个小例子在你熟悉的编译器中编译执行, 并试试能否与Lua源码树一起编译

 

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

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

你可能感兴趣的文章
什么是JAMstack?如何开始?
查看>>
firebase使用_如何使用ReactJS和Firebase构建TodoApp
查看>>
nsfw_如何使用机器学习设置NSFW内容检测
查看>>
react中使用构建缓存_如何使用React构建客户支持实时聊天小部件
查看>>
reactjs生命周期_如何在ReactJS中了解组件的生命周期方法
查看>>
graphql和rest_如何使用GraphQL使您的网站整洁和可维护
查看>>
flutter dart_Dart和Flutter的简化介绍
查看>>
hbuilder自述文件_为什么创建自述文件已成为我最喜欢的开发部分
查看>>
从ES5到ESNext-这是自2015年以来添加到JavaScript的所有功能
查看>>
GraphQL中的突变简介:它们是什么以及如何使用它们
查看>>
如何使用Blazor和Google Cloud Firestore执行CRUD操作
查看>>
emberjs_如何与Circle CI,EmberJS和GitHub进行持续集成
查看>>
协作型过滤_公司如何使用协作过滤来准确了解您想要的内容
查看>>
计算机编程课程顺序_550月份提供免费的在线编程和计算机科学课程
查看>>
gatsby_从零到部署:我如何使用Netlify + Gatsby从零开始创建静态网站
查看>>
哈希编码学习方法_想学习编码吗? 这很容易。 这是解决困难部分的方法。
查看>>
登录滑块验证表单_如何构建双滑块登录和注册表单
查看>>
javascript编写_如何编写JavaScript承诺
查看>>
哈佛 深度学习课程_通过哈佛的免费课程学习游戏开发
查看>>
计算机科学概论_计算机科学概论-哈佛大学的CS50
查看>>