通过例子学习Lua(5)—Lua与C交互入门

开发 前端
Lua与C/C++结合是很紧密的, Lua与C++交互是建立在Lua与C的基础上的, 所以偶先从Lua与C讲起.

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

  1. /* A simple Lua interpreter. */ 
  2. #include 
  3. #include 
  4. int main(int argc, char *argv[]) { 
  5. char line[BUFSIZ]; 
  6. lua_State *L = lua_open(0); 
  7. while (fgets(line, sizeof(line), stdin) != 0) 
  8. lua_dostring(L, line); 
  9. lua_close(L); 
  10. 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

  1. /* Another simple Lua interpreter. */ 
  2. #include 
  3. #include   
  4. #include   
  5. int main(int argc, char *argv[]) {   
  6. char line[BUFSIZ];   
  7. lua_State *L = lua_open(0);   
  8. lua_baselibopen(L);   
  9. lua_iolibopen(L);   
  10. lua_strlibopen(L);   
  11. lua_mathlibopen(L);   
  12. while (fgets(line, sizeof(line), stdin) != 0)   
  13. 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源码树一起编译

原文链接:http://tech.it168.com/j/2008-02-14/200802141425224.shtml

责任编辑:陈四芳 来源: 来自ITPUB论坛
相关推荐

2013-12-13 16:53:00

Lua脚本语言C++

2013-12-13 15:48:52

Lua脚本语言

2013-12-13 15:42:32

Lua脚本语言

2013-12-12 17:30:03

Lua例子

2013-12-13 15:54:32

Lua脚本语言

2011-08-23 16:59:16

C++LUA脚本LUA API

2021-01-12 06:42:50

Lua脚本语言编程语言

2011-08-23 11:13:56

Lua

2011-08-25 10:35:14

Lua语言函数

2011-08-24 17:05:01

Lua

2011-08-25 10:40:21

Lua游戏

2011-08-22 16:59:28

Lua

2011-08-22 18:08:09

Lua脚本

2011-08-25 13:22:40

CEGUILua脚本

2009-09-09 10:50:55

Scala例子Scala与Java

2011-08-22 17:41:23

LUA 脚本 语言

2011-08-24 13:27:07

Lua 游戏C接口脚本

2011-08-23 13:27:46

Luaglobal变量

2011-08-22 18:00:53

Lua语言

2013-12-13 17:33:22

Lua对象管理
点赞
收藏

51CTO技术栈公众号