Lua与C/C++的交互1:C/C++与Lua最简单的互动

转自:Lua与C/C++的交互1:C/C++与Lua最简单的互动

我想在VS中,实现C/C++与lua的交互。原理很简单,我们记住两条即可,1.lua里面的API都是用C写的。2.lua跟C/C++的交互是通过一个虚拟stack来进行数据的沟通的。在VS工程中,我们需要加入C API的头文件lua.h,  luaconfig.h , lualib.h,  luaxlib.h 。这几个头文件都是lua源代码,可以直接下载使用。lua.h提供原子级别的API,对栈的基本操作都在里面实现,里面的API都是lua_开头。luaxlib.h 定义了辅助库提供的函数,它的所有定义都以luaL_开头,辅助库是一个使用lua.h中的API编写出的一个较高的抽象层。其它的头文件做了些啥,可以自己去看源代码。下面看下完整源代码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include "stdio.h"  
  3. extern "C"  
  4. {  
  5.     #include "lua.h"  
  6.     #include "lualib.h"  
  7.     #include "lauxlib.h"  
  8. };  //lua头文件中的API都是用C写的  
  9.   
  10. #pragma comment(lib,"lua5.1.lib")       //让程序知道调用的lua里面的API可以直接在这个库里面找  
  11.   
  12. //这个函数,我们实现将压进stack里面的所有数据,从base到top,根据不同类型打印出来  
  13. void stackDump(lua_State *L)  
  14. {  
  15.     int i;  
  16.     int top = lua_gettop(L);  //获取stack大小  
  17.     for ( i = 1;i <= top;i++ )  
  18.     {  
  19.         int type = lua_type(L, i);  
  20.         switch(type)  
  21.         {  
  22.         case LUA_TSTRING:  
  23.             {  
  24.                 printf("%s",lua_tostring(L, i));  
  25.                 break;  
  26.             }  
  27.   
  28.         case LUA_TBOOLEAN:  
  29.             {  
  30.                 printf(lua_toboolean(L, i)?"true":"false");  
  31.                 break;  
  32.             }  
  33.         case LUA_TNUMBER:  
  34.             {  
  35.                 printf("%g",lua_tonumber(L, i));  
  36.                 break;  
  37.             }  
  38.         default:  
  39.             {  
  40.                 printf("%s",lua_typename(L ,i));  
  41.                 break;  
  42.             }  
  43.         }  
  44.         printf(" ");  
  45.     }  
  46.     printf("\n");  
  47. }  
  48.   
  49.   
  50. int _tmain(int argc, _TCHAR* argv[])  
  51. {  
  52.     lua_State *L;  
  53.     L = luaL_newstate();    //必须要创建lua_State环境,stack存在于这个环境中  
  54.     luaL_openlibs(L);   //加载lua静态链接库lua5.1.lib  
  55.     lua_pushboolean(L,true);  
  56.     lua_pushinteger(L,2);  
  57.     lua_pushnumber(L,2.333);  
  58.     lua_pushstring(L,"then");   //分别压入了四个不同类型的元素,现在stack里面,从base到top依次为 true , 2 , 2.333 ,then  
  59.     stackDump(L);           //打印结果 从base到top为 true , 2 , 2.333 ,then  
  60.     printf("stay here");  
  61.     return 0;  
  62. }  

结尾时,解释下C API. Lua既是一种扩展语言,也是一种可扩展语言;说它是扩展语言,意思是C/C++可以用lua进行扩展,这时C/C++拥有控制权,lua是一个库,这种形式的C/C++代码称为“应用程序代码”;说它是可扩展语言,意思是lua自身也可以通过在lua环境中注册用C语言(或其他语言) 实现的函数,然后lua可以直接调用这些函数,这时lua拥有控制权,C是一个库,这种形式的C代码称为“库代码”。这就是C跟lua交互的两种形式。应用程序代码与库代码都使用相同的API来与lua通信,这些API就是C API。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值