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

C++ 阅读C++#定义为Lua状态,c++,lua,c-preprocessor,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

对于我正在进行的一个项目,我们有大约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  
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
等等。请注意,这不是出于选择,它是由以前的开发人员设置的一个系统,在这一点上需要付出太多的努力才能实现

我被要求基本上制作一个工艺系统,希望我能使它干净有序,我想使用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文件:

#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  
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
如果不想使变量成为全局变量,请使用不同的表,而不是
\u G


上面的代码只是一个测试。你可能想一次一行地读取你的C文件或者所有的东西,然后做匹配。< /P>我不在追随这个问题,你的LUA程序和C++头不匹配。
烹饪
桑德维奇
,以及表中的
2
-1
等数字从何而来?你能提供一个匹配的例子吗?我实际上是在和我的老板谈论通过预处理器运行它。虽然我没有考虑过使用C的预处理器,但我觉得有点傻。我最担心的是速度,如果不需要的话,我不想再为一件事增加两三秒的启动时间。C预处理器速度很快。解析20Kline不需要几秒钟,只是其中的一小部分。你真的应该离线做。