lua代码:
print("print from demo lua.")
-- 访问全局变量
print("name", name)
print("age", age)
print("no", no)
print("room", room)
-- 访问全局表
print("t.len", t.len)
print("t.rock", t.rock)
print("b.beauty", b.beauty)
print("b.bname", b.bname)
CC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"
// lua调用C变量
int main()
{
lua_State* L = luaL_newstate(); /* create state */
if (L == NULL) {
printf("lua state build error.\n");
return 1;
}
luaL_openlibs(L);
//1. 构建全局变量
lua_pushstring(L, "dasheng");
lua_setglobal(L, "name");// 将栈顶的数据出栈到lua全局变量区,并且赋给一个变量名"name"
lua_pushinteger(L, 19);
lua_setglobal(L, "age");
lua_pushinteger(L, 1211031);
lua_pushstring(L, "qiufeng");
lua_setglobal(L, "room");
lua_setglobal(L, "no");
//2. 构建全局表(方法一)
lua_pushinteger(L, 999);
lua_newtable(L); // 新建一个表,并且入栈,因为表在lua虚拟机的栈中,所以表名字是不需要的
lua_pushstring(L, "len"); //用作表字段
lua_pushinteger(L, 18); //用作表字段len的值
lua_pushstring(L, "rock"); //用作表字段rock的值
lua_pushstring(L, "rock'in rock"); //用作表字段
//lua_settable从栈顶开始构建表,首先从栈中弹出value,然后再弹出key
lua_settable(L, 2); //这里第二个参数是表所在的栈下标
lua_settable(L, 2);
//lua_settable后,栈只剩下新建的表和栈底的整数999了,所以栈大小是2
printf("stack size=%d\n", lua_gettop(L));
lua_setglobal(L, "t"); //给栈顶的内容赋一个变量名,并弹出到lua的全局变量区,这里就是给表一个名字t
//2. 构建全局表(方法二)
// 为了减少干扰,首先清空栈
lua_settop(L, 0);
lua_newtable(L);
lua_pushinteger(L, 19);
lua_pushstring(L, "menglu"); //用作值
lua_setfield(L, 1, "bname"); //第二个参数是表在栈中的下标。这个函数同样在栈顶弹出一个元素,并赋值给变量bname
lua_setfield(L, 1, "beauty");
lua_setglobal(L, "b");
luaL_dofile(L, "demo.lua");
std::cin.get();
lua_close(L);
return 0;
}