lua调用C语言函数,在函数中进行类型检查

  1. 使用lua_is*函数族进行检查(除了lua_type之外的另一种方式)

    • Lua C API提供了一系列lua_is*函数,如lua_isnumberlua_isstringlua_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函数检查第二个参数是否是数字类型。如果检查不通过,就会抛出错误。
  2. 联合类型检查和转换(处理多种可能的数字类型)

    • 在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。
  3. 检查表类型及表内元素类型(处理复杂数据结构)

    • 当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_pushintegerlua_gettable组合来获取表中的元素。对于每个元素,使用相应的lua_is*函数检查类型。如果类型不符合要求,就抛出错误。
      • 最后,获取正确类型的元素后,进行打印操作,并将拼接后的结果返回给Lua。
相关推荐
顺风尿一寸26 分钟前
深入Linux内核:mkdir系统调用的完整实现解析
linux
用户23678298016827 分钟前
Linux free 命令深度解析:从内存监控到 OOM 排查的完整指南
linux
一抹晴空31 分钟前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机
bug和崩溃我都要34 分钟前
Qt 封装 libmpv 全功能视频播放器开发指南
开发语言·qt·音视频
郝学胜-神的一滴39 分钟前
Qt 高级开发 018:复刻经典登录界面布局与窗口美化全解析
开发语言·c++·qt·程序人生·用户界面
郝亚军1 小时前
IEEE 754 单精度浮点的SEM表示
开发语言·c++·算法
zhangjw341 小时前
第15篇:Java多线程零基础入门,进程线程、线程创建方式、线程生命周期、线程安全彻底吃透
java·开发语言·面试
无足鸟ICT1 小时前
【RHCA+】boxes命令(艺术框)
linux
蝈理塘(/_\)大怨种1 小时前
类和对象 (上)
java·开发语言
_Voosk1 小时前
FreeBSD 使用代理运行命令
linux·运维·freebsd