Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用。
Lua与其它脚本语言相比,其突出优势在于:

  1. 可扩展性。Lua的扩展性非常卓越,以至于很多人把Lua用作搭建领域语言的工具(注:比如游戏脚本)。Lua被设计为易于 扩展的,可以通过Lua代码或者 C代码扩展,Lua的很多功能都是通过外部库来扩展的。Lua很容易与C/C++、java、fortran、Smalltalk、Ada,以及其他语言 接口。
  2. 简单。Lua本身简单,小巧;内容少但功能强大,这使得Lua易于学习,很容易实现一些小的应用。他的完全发布版(代码、手册以及某些平台的二进制文件)仅用一张软盘就可以装得下。
  3. 高效率。Lua有很高的执行效率,统计表明Lua是目前平均效率最高的脚本语言。
  4. 与 平台无关。Lua几乎可以运行在所有我们听说过的系统上,如NextStep、OS/2、PlayStation II (Sony)、Mac OS-9、OS X、BeOS、MS-DOS、IBM mainframes、EPOC、PalmOS、MCF5206eLITE Evaluation Board、RISC OS,及所有的Windows和Unix。Lua不是通过使用条件编译实现平台无关,而是完全使用ANSI (ISO) C,这意味着只要你有ANSI C编译器你就可以编译并使用Lua。

要在C++中使用Lua非常简单,不管是GCC,VC还是C++Builder, 最简单的方法就是把 Lua源码

中除 lua.c , luac.c 和 print.c 以外的所有c文件与你的代码一起编译链接( 或加入到工程中 )即可。


当然,为了方便维护,最好还是先把Lua编译成库文件再加入工程。方法如下:


GCC
    直接在Lua所在目录下make [环境]
    这里的[环境]可以是:aix ansi bsd freebsd generic linux macosx mingw posix solaris
    如果你的环境不在这个列表中,你可以试试ansi或posix。

VC
    在命令行环境下进入Lua所在目录,执行etc\luavs.bat编译。

C++Builder
    请看我的Blog,如何在C++Builder里编译Lua

 

头文件


    因为Lua是用C语言写的,除非编译lua库时指定编译器强制以C++方式编译,否则在C++工程中应该这样包含lua头文件:


  1. extern "C" {
  2. #include "lua.h"
  3. #include "lualib.h"
  4. #include "lauxlib.h"
  5. }




例一,简单运行Lua代码

1. extern "C" {
2. #include "lua.h"
3. #include "lualib.h"
4. #include "lauxlib.h"
5. }
6.   
7. #include <iostream>
8. #include <string>
9. using namespace std;
10.   
11. int main()
12. {
13.     lua_State *L = lua_open();    //初始化lua
14.     luaL_openlibs(L);    //载入所有lua标准库
15.   
16.     string s;
17.     while(getline(cin,s))    //从cin中读入一行到s
18.     {
19.         //载入s里的lua代码后执行
20.         bool err = luaL_loadbuffer(L, s.c_str(), s.length(),
21.                     "line") || lua_pcall(L, 0, 0, 0);
22.         if(err)
23.         {
24.             //如果错误,显示
25.             cerr << lua_tostring(L, -1);
26.             //弹出错误信息所在的最上层栈
27.             lua_pop(L, 1);
28.         }
29.     }
30.   
31.     lua_close(L);//关闭
32.     return 0;
33. }



    这已经是一个功能完备的交互方式Lua解释器了。


输入print "hello world"
    输出hello world
    输入for i=1,10 do print(i) end
    输出从1到10



    要调用Lua,首先要使用

lua_open ( 对于5.0以后版本的Lua,建议使用luaL_newstate代替 )产生一个 lua_State ,在使用完后调用 lua_close 关闭。


    所有Lua与C之间交换的数据都是通过Lua中的栈来中转的。


    在本例中:


        

luaL_loadbuffer 的功能是载入并编译内存中的一段Lua代码,然后作为一个代码块( 称为chunk )压入栈中,其中的最后一个参数作为代码块的名称用于调试。和它功能类似的还有 luaL_loadfile (载入文件), luaL_loadstring (载入字符串,本例中也可用它代替 luaL_loadbuffer )。它们有一个相同的前缀: luaL_ ,为了简化编程,Lua C API将库中的核心函数包装后作为辅助函数提供一些常用功能,它们的形式都是 luaL_* ,如这里的三个 luaL_load* 都调用了 lua_load 。


        

lua_pcall 从栈顶取得函数并执行,如果出错,则返回一个非0值并把错误信息压入栈顶。关于它的更详细信息会在“ 例三,在C++中调用Lua子函数

”中介绍。


        如果宿主程序检测到错误,就用

lua_tostring 从栈顶取得错误信息转成字符串输出,然后弹出这个错误信息。


    

lua_tostring 里 的第二个参数指定要操作的数据处于栈的哪个位置,因为所有的数据只能通过栈来交换,所以很多Lua的C API都会要求指定栈的位置。1表示在栈中的第一个元素(也就是第一个被压入栈的),下一个索引是2,以此类推。我们也可以用栈顶作为参照来存取元素,使 用负数:-1指出栈顶元素(也就是最后被压入的),-2指出它的前一个元素,以此类推。