从零开始的Lua/C++绑定

4
我刚接触Lua,试图理解一些基础知识。我想要了解的是如何将Lua绑定到C++实例。
我不感兴趣第三方库,我想更深入地了解这个问题 - 谢谢 :)
以下是我的问题:
  1. 根据我所读的内容,我的假设是Lua只能绑定静态C函数。这是正确的吗?
  2. 这是否意味着为了绑定C++类的实例,我需要首先为我想要的每个方法和属性getter/setter编写静态函数,并接受一个实例指针作为参数。
  3. 我会在Lua中注册这些函数。
  4. 我会传递一个指向C++类实例的指针给Lua。
  5. 从Lua中,我将调用其中一个已注册的函数,传递C++实例指针。
  6. 静态函数取消引用指针,调用相应的方法。
这样说通吗?还是我有什么错误?
感谢您阅读到这里。

将不同语言绑定通常通过 C 接口完成(C 的 ABI 更好地定义)。我对 Lua 不够熟悉,无法了解其详细信息,但我的建议是选择库解决方案。你将会重新发明轮子,并且要让它像现有的解决方案一样圆可能并不容易。至少,看看那些库都做了什么。 - David Rodríguez - dribeas
1
谢谢,但我特别想了解Lua的原理,因为我有一个使用案例,不想(也不允许)使用第三方库。我已经研究了一些库,但我只对这个如何工作的核心原理感兴趣,而且无法从库中理解(高度抽象,阅读量大)。 - user1654794
许多使用Lua-C++绑定的第三方库都是开源的。你总可以看看它们是如何做事情的,以便理解它们。但请注意风险。 - Bartek Banachewicz
1个回答

4
这正是我的强项。
1) Lua...它并没有真正地绑定到东西上,你需要做的是“与Lua友好相处”,这需要了解Lua的一些工作原理。
我非常建议阅读http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf。那告诉你关于Lua能够做的所有事情。所以Lua提供给你的函数只允许你操作那些结构。
之后,一切都会更加清晰明了。 为什么这个答案应该在这里结束 你在第一个问题之后问的问题都是错误的。而且,第一个问题本身在语义上也是错误的,一个静态函数只有内部/弱链接。我猜你的意思是“不是一个方法”。
2) 不完全正确,要记住对象(以及带有表/元表的Lua)具有很好的“self”/“this”标识身份的能力 - 你并不绑定到方法上。
你想让Lua调用你的某个函数并带有一个“self”参数,那个“self”(无论是什么,一个简单的整数ID,或者如果你感觉危险可以使用void*)应该告诉你你正在使用哪个对象。
第3/4/5/6个问题并没有什么意义,请阅读那份文件 :) 如果您需要更多说明或有更具体的问题,请在回复中进行评论,这并不是一个坏的问题,只是幼稚。

嗨 Alec,感谢你的回答 - 我对 Lua 的工作原理有所了解;通过堆栈和表进行通信,并使用元表来存储/组织数据。我认为问题可能在于我的绑定术语。我想让 Lua 调用 C++ 实例上的函数。'你希望 Lua 调用你的某个带有“self”参数的函数,“self”应该告诉你正在处理哪个对象。' 是的,完全正确 - 那么我该如何实现这一点,我应该创建接受 void* 并对其进行取消引用,然后调用 C++ 实例上等效方法的 C++ 静态函数吗? - user1654794
1
@user1654794,这取决于你自己,如果你敢尝试使用void*的方式,请使用dynamic_cast,你会惊讶于有多少次坏的转换不会导致崩溃。为什么不看一些教程或其他库的代码呢?那是我学习的方式。 - Alec Teal
好的,非常感谢Alec。我最担心的是这种方法不好或者被人所反对。自从得到你的回复后,我更有信心只需运行代码并观察结果 :) 顺便感谢你的dynamic_cast提示,这是测试Lua指针是否为正确类型的绝佳方法。再次感谢! - user1654794
嗨,Alec,我昨天已经点赞了(并且也接受了你的第一个回复作为有效答案)-很抱歉它没有显示出来。在我的浏览器中,它显示为已点赞-现在你那边也解决了吗?谢谢! - user1654794

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接