【问题标题】:Lua/C++ binding from scratch从头开始 Lua/C++ 绑定
【发布时间】:2013-12-29 14:25:33
【问题描述】:

我是 Lua 的新手,并试图了解一些基础知识。我想了解的是将 Lua 绑定到 C++ 实例。

我对第三方库不感兴趣,我想从更基础的层面了解这一点 - 谢谢 :)

这是我的问题:

  1. 根据我的阅读,我的假设是 Lua 只能绑定到静态 C 函数。这是正确的吗?
  2. 这是否意味着要绑定 C++ 类的实例,我首先需要为我想要的每个方法和属性 getter/setter 编写静态函数,并接受实例指针作为参数。
  3. 我会用 Lua 注册这些函数。
  4. 我会向 Lua 传递一个指向 C++ 类实例的指针。
  5. 我会从 Lua 调用其中一个注册函数,传递 C++ 实例指针。
  6. 静态函数取消引用指针,调用等效方法。

这有意义吗?还是我做错了什么?

感谢您阅读本文。

【问题讨论】:

  • 绑定不同的语言通常是通过 C 接口完成的(ABI 最好为 C 定义)。我对 lua 不够熟悉,无法了解详细信息,但我的建议是选择库解决方案。您将重新发明轮子,让它像现有解决方案一样圆润可能并非易事。至少,看看这些库是做什么的。
  • 谢谢,但我特别想了解 Lua 的原理,用于我不想(不允许)使用第三方库的用例。我研究了几个库,但我只对它的工作原理感兴趣,而无法从库中掌握这一点(高度抽象,大量阅读)。
  • 许多使用 Lua-C++ 绑定的第三方库都是开源的。你总是可以看看他们是如何做事的,以了解他们。 警告购买者

标签: c++ c oop binding lua


【解决方案1】:

这是我的盟友。

1) Lua ... 它并没有真正绑定到任何东西,您需要做的是“与 Lua 相处融洽”,这需要了解 Lua 的工作原理。

我真的建议阅读http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

这告诉了你 Lua 实际上能做的一切。所以 Lua 给你的函数让你只操作那些结构。

在那之后,一切都变得更有意义了。

为什么这个答案应该在这里结束

你在1之后的问题都是错误的。并且 1 在语义上是错误的,静态函数只有内部/弱链接。我猜你的意思是“不是方法”

2) 不是真的,记住你对对象有很好的“self”/“this”标识(以及对表/元表的 lua)——你不绑定到方法。

您希望 Lua 使用“self”参数调用您的某个函数,“self”(无论它可能是什么,一个简单的整数 ID,或者如果您感到危险,则为 void*)应该告诉您什么 ojbect与您合作。

3/4/5/6 真的没有意义,请阅读该文档 :) 如果您需要更多或有更具体的内容,请在回复中发表评论,这不是一个坏问题,顺便说一句,它只是幼稚

【讨论】:

  • 嗨,Alec,感谢您的回答 - 我熟悉 Lua 的一般工作方式;通过堆栈和表和元表进行通信,用于存储/组织数据。我想问题可能出在我关于绑定的术语上。我想从 Lua 调用 C++ 实例上的函数。 '你想让 Lua 用一个“self”参数调用你的某个函数,那个“self”应该告诉你你正在使用什么对象。是的,完全正确 - 那么我该如何实现这一点,我应该创建接受 void* 并取消引用它的 C++ 静态函数,然后在 C++ 实例上调用等效方法吗?
  • @user1654794 这取决于您,请记住,如果您敢于使用 void* 方式,请使用 dynamic_cast,您会惊讶于错误转换不会导致崩溃的频率。为什么不看看教程或其他库的代码。我就是这么学的。
  • 好的,谢谢亚历克。我主要担心的是这种方法不好,或者不受欢迎。由于您的回复,我对简单地运行代码并查看会发生什么更有信心:) 顺便感谢 dynamic_cast 提示。测试来自 Lua 的指针的好主意是正确的类型。 :) 再次感谢!
  • 嗨,亚历克,我昨天投了赞成票(并且还接受了您的第一个回复作为有效答案) - 抱歉,它看起来不是那样的。它在我的浏览器中显示为赞成 - 现在是否也解决了您的问题?谢谢!
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2013-12-08
  • 2011-06-20
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多