Table是Lua里面特有的数据结构。要想在C语言中访问这种数据结构需要使用lua提供的一系列函数才行。其实,很简单,仅仅涉及到几个小函数。废话少说,上代码。

代码

LuaTable.lua

 luat_Test={a=123, b=456,c=789}

LuaTable.cpp

 #include <lua.hpp>
// 获取Table的Item
static void GetTableItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)
{
    lua_getglobal(L, lpszTableName);     // 获取Table    
    lua_pushstring(L, lpszTableItem);     // 指定要得到的是哪个Item
    lua_gettable(L, -2);                            // 获取Item的值,并将值压入栈里面
    printf("%s.%s=%d\n", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1));  // 从栈里面得到值并打印
    lua_pop(L, 2);                                    // 将Item和Table从栈里面弹出
}
// 枚举Table中的Item
static void EnumTableItem(lua_State *L, const char* lpszTableName)
{
    lua_getglobal(L, lpszTableName);    // 获取Table    
    int it = lua_gettop(L);                         // 获取栈顶,此时Table肯定在栈顶
    lua_pushnil(L);                                  // ??
    while(lua_next(L, it))                         // 开始枚举,并把枚举到的值压入栈
    {
        printf("%d\n", (int)lua_tonumber(L, -1));   // 得到Item的值
        lua_pop(L, 1);                              // 将Item从栈里面弹出
    }
    lua_pop(L, 1);                                  // 将Table从栈里面弹出
}

int main (void)
{
    lua_State *L = lua_open();
    luaopen_base(L);

    luaL_dofile(L, "LuaTable.lua");
    GetTableItem(L, "luat_Test", "a");
    GetTableItem(L, "luat_Test", "b");
    GetTableItem(L, "luat_Test", "c");

    EnumTableItem(L, "luat_Test");
    lua_close(L);
    return 0;
}

makefile

 CFLAG=`pkg-config --cflags lua5.1`
LDFLAG=`pkg-config --libs lua5.1`
CC=g++
all: LuaTable
LuaTable : LuaTable.cpp
    $(CC) -o $@ $(CFLAG) $(LDFLAG) $<

测试环境

类型
操作系统 Ubuntu 10.10
lua 5.1.4

运行结果

图片3.png