3

对于我正在做的一个项目,我们有大约 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++ #defines。(也许可以?那很好。)

我想知道是否有任何库或模块或我可以用来阅读这些定义的东西,或者我是否应该使用另一种方法而不是 Lua?诚然,我对它相对不熟练,但如果有一个起点,我应该能够毫不费力地启动并运行一些东西。

4

2 回答 2

3

我不确定您的确切需求是什么。

如果您只需要用相应的数字替换这些标识符,运气好的话,您也许可以通过 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-09T11:17:56.317 回答
1

您可以尝试使用boost::wave来解析这些标头。

于 2013-08-09T09:28:36.467 回答