我应该如何记录用C ++代码编写的Lua API /对象模型?
我正在努力为 Bitfighter 游戏(http://bitfighter.org)编写一份新的、扩展的 Lua API 文档。我们的 Lua 对象模型是 C++ 对象模型的一个子集,而我要记录的那些暴露给 Lua 的方法是 C++ 中可用方法的一个子集。我想只记录与 Lua 相关的内容,而忽略其余部分。
例如,对象 BfObject 是所有 Lua 对象的根对象,但它本身处于 C++ 对象树的中间位置。BfObject 有大约 40 个 C++ 方法,其中约有 10 个与 Lua 脚本有关。我希望我们的文档将 BfObject 显示为根对象,并仅显示那些与之相关的 10 个方法。我们还需要以一种清晰明了的方式显示其子对象的继承关系。
目前,我们可以假设所有代码都是用 C++ 编写的。
一个想法是以某种方式标记我们想要记录的对象,以使像 Doxygen 这样的系统知道该查看什么内容而忽略其余部分。另一种方法是以预处理 C++ 代码的方式删除所有不相关的部分,然后使用类似 Doxygen 的工具记录剩余部分。(我实际上在使用 luadoc 时已经取得了很大的进展,但无法找到一种可以让 luadoc 显示对象层次结构的方法。)
有一件可能有帮助的事情是每个 Lua 对象类都以一种一致的方式注册,并伴随其父类。
目前有越来越多的游戏使用 Lua 进行脚本编写,并且很多游戏都有不错的文档。有没有人有好的建议,可以帮助我编写出好的文档呢?
顺便说一句,为了澄清,我很乐意使用任何可以完成工作的工具——Doxygen 和 luadoc 只是我比较熟悉的例子。
我已经找到了一个解决方案,虽然并不完美但很有效。我拼凑了一个Perl脚本,遍历Bitfighter源代码并生成第二套“虚假”源代码,其中仅包含我想要的元素。然后我可以通过Doxygen运行这个二级源代码并获得95%的我想要的结果。
我宣布获得了胜利。
这种方法的一个优点是我可以自然地文档化代码,无需担心标记哪些在内部和外部。该脚本足够聪明,可以从代码结构中找出答案。
如果有人感兴趣,Perl脚本可在Bitfighter源存档中找到https://code.google.com/p/bitfighter/source/browse/luadoc.pl 。它只完成了80%,缺少一些非常重要的内容(如正确显示函数参数),但结构已存在,并且我满意该过程将顺利进行。该脚本将随着时间的推移而改进。
(非常初步的)过程结果可在http://bitfighter.org/luadocs/index.html 查看。模板几乎没有修改,因此看起来非常“基本”,但它表明事情或多或少起作用。
由于一些评论者认为使用Doxygen生成好的文档是不可能的,因此我应该指出,几乎没有添加任何内联文档。要了解它们看起来像什么,请参见Teleporter类。它不是很好,但我认为它可以反驳Doxygen总是产生无用文档的观点。
现在我最大的遗憾是我的解决方案实际上只是一次性的,并且没有解决我认为社区中日益增长的需求。也许在某个时候,我们将以一种合并C ++和Lua的方式为标准,并且创建通用文档工具的任务将更加可行。
PS您可以看到原始源文件中的标记呈现方式...请参见https://code.google.com/p/bitfighter/source/browse/zap/teleporter.cpp,并搜索@luaclass
另一个解决方案是使用[LDoc](https://github.com/stevedonovan/LDoc)。它还允许您编写C ++注释,这些注释将由LDoc解析并包含在文档中。
优点是您可以使用相同的工具来记录您的lua代码。缺点是该项目似乎未得到维护。像提问者提到的那样,可能无法记录复杂的对象层次结构。
我为一些与C ++有关的小调整分叉了它。请看[这里](https://github.com/flyingdutchman23/LDoc)。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
在 doxygen 配置文件中,可以通过 namespace(也可以是类)从你的 C++ 代码中排除,但不排除 lua 代码。
EXCLUDE_SYMBOLS = myhier_cpp::*或者使用以下方法进行选择性排除:
/// @cond class aaa { ... ... } /// @endcond在你的 C++ 代码中。
个人认为通过 namespace 分离更好,因为它反映了代码和文档中的分离,这导致了一个基于 namespace 的纯 C++ 和 lua 绑定分离方案。
通过排除进行分离可能是最具有针对性的方法,但这将涉及到一个额外的工具来解析代码,标记相关的 lua 部分并将排除添加到代码中。(此外,您还可以使用此标记单独呈现特殊的信息,例如图形,并通过 Image 添加到您的文档中,至少使用 Doxygen 容易完成。)由于必须要有一些 lua 代码的指示,因此标记可能不太难推导。