C函数从lua中读取数据接口常用接口
- 读取基本数据类型的接口
lua_tonumber
和lua_tointeger
- 用途:用于从Lua栈中获取数字类型的数据。
lua_tonumber
用于获取浮点数,lua_tointeger
用于获取整数。 - 示例:假设在Lua中调用一个C函数并传入一个数字,在C函数中可以这样获取这个数字。
static int get_number(lua_State *L) { double num = lua_tonumber(L, 1); // 获取栈顶(第一个参数)的数字(浮点数) int integer_num = lua_tointeger(L, 1); // 尝试获取栈顶的整数 // 可以进行后续操作,比如打印或其他计算 printf("浮点数: %f, 整数: %d\n", num, integer_num); return 0; }
- 用途:用于从Lua栈中获取数字类型的数据。
lua_tostring
- 用途:用于从Lua栈中获取字符串类型的数据。
- 示例:当Lua传入一个字符串给C函数时,可以使用这个接口获取。
static int get_string(lua_State *L) { const char *str = lua_tostring(L, 1); // 获取栈顶(第一个参数)的字符串 printf("字符串: %s\n", str); return 0; }
lua_toboolean
- 用途:用于从Lua栈中获取布尔类型的数据。
- 示例:如果Lua传入一个布尔值给C函数,可以如下获取。
static int get_boolean(lua_State *L) { int boolean_value = lua_toboolean(L, 1); // 获取栈顶(第一个参数)的布尔值 printf("布尔值: %d\n", boolean_value); return 0; }
- 读取表(Table)类型数据的接口
lua_istable
、lua_gettable
和lua_push*
系列函数组合- 用途:
lua_istable
用于检查栈顶元素是否是表。lua_gettable
用于获取表中的元素,通常需要先将键(可以是数字或字符串)压入栈,然后调用lua_gettable
来获取对应的值。lua_push*
系列函数用于将键压入栈。 - 示例:假设在Lua中有一个表
{name = "John", age = 30}
,在C函数中获取表中的元素。
static int get_table_data(lua_State *L) { if (lua_istable(L, 1)) { // 检查第一个参数是否是表 lua_pushstring(L, "name"); // 将键"name"压入栈 lua_gettable(L, 1); // 获取表中键为"name"的值 const char *name = lua_tostring(L, -1); // 获取栈顶的值,即"name"对应的字符串 lua_pop(L, 1); // 弹出栈顶元素 lua_pushinteger(L, 2); // 将键2(这里假设表中的第二个元素的键是2)压入栈 lua_gettable(L, 1); // 获取表中键为2的值 int age = lua_tointeger(L, -1); // 获取栈顶的值,即年龄对应的整数 lua_pop(L, 1); // 弹出栈顶元素 printf("姓名: %s, 年龄: %d\n", name, age); } else { lua_pushstring(L, "第一个参数必须是表"); lua_error(L); } return 0; }
- 用途:
- 读取函数类型数据的接口
lua_tocfunction
- 用途:用于从Lua栈中获取C函数(C closure)。
- 示例:如果Lua传入一个C函数(这个C函数可能是之前通过
lua_pushcfunction
等方式注册到Lua中的)给另一个C函数,可以这样获取。
static int call_lua_passed_cfunction(lua_State *L) { lua_CFunction cfunc = lua_tocfunction(L, 1); // 获取栈顶(第一个参数)的C函数 // 可以调用这个C函数,假设它不需要参数并且返回一个数字 lua_pushnumber(L, cfunc(L)); return 1; // 返回一个结果 }
- 读取用户数据(UserData)类型的接口
lua_touserdata
- 用途:用于从Lua栈中获取用户数据。用户数据是一种可以在Lua和C之间传递自定义数据结构的机制。
- 示例:假设在C中定义了一个结构体,并且将这个结构体的实例作为用户数据传递给Lua,在C函数中可以这样获取。
typedef struct { int value; } MyUserData; static int get_userdata(lua_State *L) { MyUserData *user_data = (MyUserData *)lua_touserdata(L, 1); // 获取栈顶(第一个参数)的用户数据 printf("用户数据中的值: %d\n", user_data->value); return 0; }
原文地址:https://blog.csdn.net/qq_33471732/article/details/143816187
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!