2013-12-11 185 views
5

我一直在寻找相当长的一段时间,并且我还没有找到从C++中获取所有全局变量的方法。考虑一下这个小Lua测试脚本。循环遍历C++中的所有Lua全局变量

myGlobal1 = "Global 1" 
myGlobal2 = 2 

function test() 
    local l1=0 
    print (myGlobal1,myGlobal2,l1) 
end 

test() 

假设你在print (myGlobal1,myGlobal2,l1)暂停执行,并从C++得到所有的全局变量(myGlobal1myGlobal2)。这些例子是任意的,从C++的角度来看,全局变量是未知的。

我一直在寻找lua_getglobal()但我需要先知道变量的名称。我看着lua_getupvalue(),但结果只得到“_ENV”。

我想我可以尽快使用lua_getglobal()我知道它们的名字,但是如何获得全局变量列表(来自C++)?我有在这一点上lua_Debug结构(如果它是任何人的帮助)

编辑 此信息最初是有关通过表迭代,它不是关于如何找到用户自己的全局。

但是,我发布了一个解决方案,可以如何完成here

+3

[使用这个(http://stackoverflow.com/questions/1438842/iterating-through-a-lua -table-from-c)记住全局变量只是'_G'中的索引。 –

+0

Lua 5.1或5.2? –

+0

@Bartek所以迭代_G会给我所有的全局变量吗? –

回答

8

好吧我解决了它。

lua_pushglobaltable(L);  // Get global table 
lua_pushnil(L);    // put a nil key on stack 
while (lua_next(L,-2) != 0) { // key(-1) is replaced by the next key(-1) in table(-2) 
    name = lua_tostring(L,-2); // Get key(-2) name 
    lua_pop(L,1);    // remove value(-1), now key on top at(-1) 
} 
lua_pop(L,1);     // remove global table(-1) 

lua_next()无法找到更多的条目中的关键名字被弹出留在顶部(-1)的表。

接下来的问题是,从表项的其余部分区分自己的全局...

+1

[manual](http://www.lua.org/manual/5.2/manual.html#lua_next)说:“在遍历表时,除非你知道密钥实际上是一个字符串,否则不要直接调用'lua_tolstring'。回想一下'lua_tolstring'可能会改变给定索引处的值;这会将下一个调用混淆到'lua_next'。你不可能有一个全局变量,其名称不是字符串,但可能发生。 – lhf

+0

是的,我明白了。我忘了编辑我的文章。我试图找到一个更好的方法来过滤掉我的全局变量。 –

+0

询问关于过滤掉全局变量的单独问题。 – lhf