不止八股---Lua原理笔记(4)和c语言交互

本文详细介绍了如何配置Lua5.3与C语言的交互环境,包括`luaex`的使用,`externC`的关键作用,以及通过`lua_getglobal`,`lua_setfield`,`lua_pcall`等API进行数据交换、操作表和调用函数的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章为之后的xlua打铺垫

环境配置

没绷住,鼓捣了半天才弄好

主要配置方法见下链接

lua5.3与c交互环境_lua ex-优快云博客

按照上面的还不够,跑的时候还是报错了

进行下面修改后跑通了

[2]

#include时要加上extern "C",告知编译器链接时不要按C++方法查找符号,这一步很重要。

extern "C" 
{     
  #include "lua.h"     
  #include "lauxlib.h"     
  #include "lualib.h" 
}

Lua和c交互的原理---虚拟栈

        Lua 和 C之间通信的主要组件是无处不在的虚拟栈(stack), 几乎所有的API调用都是 在操作这个栈中的值, Lua与C之间所有的数据交换都是通过这个栈完成的。 此外,还可以 利用栈保存中间结果。

        栈中的每个元素都能保存Lua中任意类型的值。 当我们想要从Lua中获取一个值 (例如一个全局变量的值)时,只需调用Lua, Lua就会将指定的值压入栈中。 当想要将一个 值传给Lua时, 首先要将这个值压入栈,然后调用Lua将其从栈中弹出即可

        如图栈顶索引为-1,栈底索引为1

压入元素C API

获取元素C API

  

检查类型

小实验



void stackTest()
{
	lua_State* L = luaL_newstate();
	lua_pushstring(L, "testForCCallLua");
	lua_pushnumber(L, 123);

	//读栈取值
	if (lua_isstring(L, -2))//或if(lua_isstring(L,1))
	{
		std::cout << lua_tostring(L, -2) << std::endl;
	}
	if (lua_isnumber(L, -1))
	{
		std::cout << lua_tonumber(L, -1) << std::endl;
	}
   

	//关闭state
	lua_close(L);
}

int main()
{
	stackTest();
	system("pause");
	return 0;
}

c调用Lua

Lua代码

-- test.lua
name = "ccc"
id = 33
user = { uid = 33, uname = "forward256&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值