在C++中使用Lua(一)

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指出它的前一个元素,以此类推。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值