将C ++ #defines读取到Lua状态中

我正在处理的一个项目中,我们有大约 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

等等。请注意,这并不是我们的选择,而是由之前的开发人员设置的系统,现在花费太大的努力来改变是不切实际的。

我被要求基本上制作一个制作系统,并希望我能使其干净有序,因此我想使用 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之外的其他方法?我承认自己对此相对不熟练,但是给定一个起点,我应该能够很轻松地建立并运行一些东西。

点赞
用户1549474
用户1549474

你可以尝试使用 boost::wave 来解析这些头文件。

2013-08-09 09:28:36
用户107090
用户107090

我不确定你的具体需求是什么。

如果你只需要将那些标识符替换为相应的数字,也许可以通过 C 预处理器(cppgcc -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 文件,然后进行匹配。

2013-08-09 11:17:56