-
使用
lua_is*函数族进行检查(除了lua_type之外的另一种方式)- Lua C API提供了一系列
lua_is*函数,如lua_isnumber、lua_isstring、lua_isboolean等,用于检查栈上元素的类型。 - 示例代码如下,假设我们有一个C函数,它期望接收一个布尔值和一个数字作为参数:
c#include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> static int check_and_print(lua_State *L) { // 检查第一个参数是否为布尔值 if (!lua_isboolean(L, 1)) { lua_pushstring(L, "第一个参数必须是布尔值"); lua_error(L); } // 检查第二个参数是否为数字 if (!lua_isnumber(L, 2)) { lua_pushstring(L, "第二个参数必须是数字"); lua_error(L); } int booleanValue = lua_toboolean(L, 1); double numberValue = lua_tonumber(L, 2); printf("布尔值为: %d, 数字为: %f\n", booleanValue, numberValue); // 可以根据需要返回值给Lua,这里简单返回数字 lua_pushnumber(L, numberValue); return 1; }- 在这里,
lua_isboolean函数检查第一个参数是否是布尔类型,lua_isnumber函数检查第二个参数是否是数字类型。如果检查不通过,就会抛出错误。
- Lua C API提供了一系列
-
联合类型检查和转换(处理多种可能的数字类型)
- 在Lua中,数字类型可能是整数或者浮点数。当在C函数中接收数字类型参数时,可以使用联合(union)来处理不同的数字类型情况。
- 示例代码如下,这个C函数可以接收整数或者浮点数作为第一个参数,并将其转换为浮点数进行处理:
c#include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> #include <math.h> static int process_number(lua_State *L) { // 检查第一个参数是否是数字类型 if (!lua_isnumber(L, 1)) { lua_pushstring(L, "第一个参数必须是数字"); lua_error(L); } // 使用union来处理可能的整数或浮点数情况 union { int i; double d; } number; if (lua_isinteger(L, 1)) { number.i = lua_tointeger(L, 1); } else { number.d = lua_tonumber(L, 1); } // 对转换后的浮点数进行简单的数学操作(这里是求平方根) double result = sqrt(number.d); lua_pushnumber(L, result); return 1; }- 在这个示例中,首先使用
lua_isnumber检查参数是否是数字类型。然后,通过一个联合来处理整数和浮点数的转换。如果参数是整数,就使用lua_tointeger将其转换为整数存储在联合中;如果是浮点数,就使用lua_tonumber将其转换为浮点数存储在联合中。最后,对转换后的浮点数进行求平方根操作,并将结果返回给Lua。
-
检查表类型及表内元素类型(处理复杂数据结构)
- 当Lua传递表(table)类型的参数给C函数时,需要检查表的类型以及表内元素的类型。
- 以下示例是一个C函数,它期望接收一个表,表中有两个元素,第一个元素是字符串,第二个元素是数字,然后打印这两个元素并返回它们的拼接结果(字符串和数字转换为字符串后拼接):
c#include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> static int process_table(lua_State *L) { // 检查第一个参数是否是表类型 if (!lua_istable(L, 1)) { lua_pushstring(L, "第一个参数必须是表"); lua_error(L); } // 获取表中的两个元素 lua_pushinteger(L, 1); lua_gettable(L, 1); if (!lua_isstring(L, - 1)) { lua_pushstring(L, "表中的第一个元素必须是字符串"); lua_error(L); } const char *str = lua_tostring(L, - 1); lua_pop(L, 1); lua_pushinteger(L, 2); lua_gettable(L, 1); if (!lua_isnumber(L, - 1)) { lua_pushstring(L, "表中的第二个元素必须是数字"); lua_error(L); } double num = lua_tonumber(L, - 1); lua_pop(L, 1); printf("字符串是: %s, 数字是: %f\n", str, num); char buffer[100]; sprintf(buffer, "%s%f", str, num); lua_pushstring(L, buffer); return 1; }- 在这个示例中:
- 首先使用
lua_istable检查第一个参数是否是表类型。 - 然后通过
lua_pushinteger和lua_gettable组合来获取表中的元素。对于每个元素,使用相应的lua_is*函数检查类型。如果类型不符合要求,就抛出错误。 - 最后,获取正确类型的元素后,进行打印操作,并将拼接后的结果返回给Lua。
- 首先使用
lua调用C语言函数,在函数中进行类型检查
最后一个bug2024-11-17 18:55
相关推荐
墨辰JC3 分钟前
C语言可变参数讲解:stdarg.h应用Larry_Yanan7 分钟前
Qt多进程(八)消息队列(基于文件)毕设源码-钟学长10 分钟前
【开题答辩全过程】以 基于java旅游网站的设计与实现为例,包含答辩的问题和答案0和1的舞者13 分钟前
接口自动化测试详解(二):requests 请求封装与 Pytest 框架全实战CreasyChan13 分钟前
VirtualBox 安装 CentOS 7.2C语言小火车13 分钟前
C++右值引用与转移语义详解AAA.建材批发刘哥13 分钟前
04--C++ 类和对象下篇杰克崔26 分钟前
glibc社区提问CoderCodingNo36 分钟前
【GESP】C++五级真题(数论考点) luogu-P11961 [GESP202503 五级] 原根判断乾元40 分钟前
网络切片的自动化配置与 SLA 保证——5G / 专网场景中,从“逻辑隔离”到“可验证承诺”的工程实现