2013-12-11 183 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