微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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编写出的一个较高的抽象层。其它的头文件做了些啥,可以自己去看源代码。下面看下完整源代码

#include "stdafx.h"
#include "stdio.h"
extern "C"
{
	#include "lua.h"
	#include "lualib.h"
	#include "lauxlib.h"
};	//lua头文件中的API都是用C写的

#pragma comment(lib,"lua5.1.lib")		//让程序知道调用的lua里面的API可以直接在这个库里面找

//这个函数,我们实现将压进stack里面的所有数据,从base到top,根据不同类型打印出来
void stackDump(lua_State *L)
{
	int i;
	int top = lua_gettop(L);  //获取stack大小
	for ( i = 1;i <= top;i++ )
	{
		int type = lua_type(L,i);
		switch(type)
		{
		case LUA_TSTRING:
			{
				printf("%s",lua_tostring(L,i));
				break;
			}

		case LUA_TBOOLEAN:
			{
				printf(lua_toboolean(L,i)?"true":"false");
				break;
			}
		case LUA_TNUMBER:
			{
				printf("%g",lua_tonumber(L,i));
				break;
			}
		default:
			{
				printf("%s",lua_typename(L,i));
				break;
			}
		}
		printf(" ");
	}
	printf("\n");
}


int _tmain(int argc,_TCHAR* argv[])
{
	lua_State *L;
	L = luaL_newstate();	//必须要创建lua_State环境,stack存在于这个环境中
	luaL_openlibs(L);	//加载lua静态链接库lua5.1.lib
	lua_pushboolean(L,true);
	lua_pushinteger(L,2);
	lua_pushnumber(L,2.333);
	lua_pushstring(L,"then");  	//分别压入了四个不同类型的元素,现在stack里面,从base到top依次为 true,2,2.333,then
	stackDump(L);			//打印结果 从base到top为 true,then
	printf("stay here");
	return 0;
}

结尾时,解释下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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐