读取C++#定义为Lua状态
Reading C++ #defines into Lua state
对于我正在进行的一个项目,我们有大约2k个定义,用于识别游戏中的不同项目,看起来如下:
#define ITEMID_WEAPON_SWORD_PEARL 41
#define ITEMID_WEAPON_SWORD_CYCLONE 42
#define ITEMID_WEAPON_SWORD_INVADERS 43
#define ITEMID_WEAPON_SWORD_SWITCH 44
#define ITEMID_WEAPON_SWORD_MULTIBLADE 45
#define ITEMID_WEAPON_SWORD_KATANA 46
Etc等。请注意,这不是你的选择,这是一个由以前的开发人员设置的系统,在这一点上需要付出太多的努力才能实现。
我被要求基本上制作一个手工制作系统,希望我能让它干净有序,我想使用Lua。我的计划基本上是做以下事情:
Cooking =
{
["Sandvich"] =
{
{ --In
{ITEMID_COOKING_BREAD, 2, -1},
{ITEMID_COOKING_MEAT, 1, -1},
{ITEMID_COOKING_TOMATO, 1, -1},
},
{ --Out
{ITEMID_COOKING_SANDVICH, 1}
}
}
}
不过,我能看到的唯一问题是,据我所知,Lua不能以本机方式读取C/C++定义。(也许可以?那太好了。)
我想知道是否有任何库或模块或我可以用来阅读这些定义的东西,或者我是否应该使用另一种方法而不是Lua?无可否认,我在这方面相对不熟练,但如果有一个起点,我应该能够毫不费力地完成一些工作。
我不确定你的确切需求是什么。
如果您只需要用相应的数字替换这些标识符,那么幸运的话,您可以通过C预处理器(cpp
或gcc -E
)运行Lua文件。
如果你想用这些名称和值定义Lua变量,你可以用下面的代码解析Lua中的C文件:
C=[[
#define ITEMID_WEAPON_SWORD_PEARL 41
#define ITEMID_WEAPON_SWORD_CYCLONE 42
#define ITEMID_WEAPON_SWORD_INVADERS 43
#define ITEMID_WEAPON_SWORD_SWITCH 44
#define ITEMID_WEAPON_SWORD_MULTIBLADE 45
#define ITEMID_WEAPON_SWORD_KATANA 46
]]
for k,v in C:gmatch("#define%s+(%S+)%s+(%d+)") do
_G[k]=tonumber(v)
end
如果您不想使变量成为全局变量,请使用不同的表,而不是_G
。
上面的代码只是一个测试。您可能想一行一行地读取C文件,或者一次读取所有内容,然后进行匹配。
您可以尝试使用boost::wave来解析这些标头。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- C++Lua用户数据扰乱了Mathfu浮点值
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 通过require在不同的Lua状态之间共享全局变量
- 创建 Lua 状态时的访问冲突
- 从指针访问 Kaguya Lua 状态
- C++的多个Lua状态
- 在提升shared_ptr中存储多个 Lua 状态
- 读取C++#定义为Lua状态
- 将表从一个lua状态传递到另一个lua状态
- 如何确保发生错误后(luabind)lua 状态良好