读取C++#定义为Lua状态

Reading C++ #defines into Lua state

本文关键字:Lua 状态 定义 C++# 读取      更新时间:2023-10-16

对于我正在进行的一个项目,我们有大约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预处理器(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文件,或者一次读取所有内容,然后进行匹配。

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