将C ++ #defines读入Lua状态

时间:2013-08-09 09:25:35

标签: c++ lua c-preprocessor

对于我正在进行的项目,我们有大约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?我承认自己相对不熟练,但考虑到起点,我应该能够以很少的努力获得一些东西。

2 个答案:

答案 0 :(得分: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文件或一次读取所有内容,然后进行匹配。

答案 1 :(得分:1)

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