c和lua进行的一些基础交互和处理,这里留用lua5.1

本文详细介绍了C语言与Lua脚本语言之间的交互过程,包括如何在C中注册Lua函数、从Lua调用C函数及在C中操作Lua表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

static int my_add(lua_State *L)
{
    int a = luaL_checknumber(L, 1);
    int b = luaL_checknumber(L, 2);
    lua_pushnumber(L, a + b);
    return 1;
}

static const struct luaL_Reg mylib[] = {
    {"madd", my_add },
    {NULL, NULL}
};

int main(int argc, char** argv) {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    //=============================================
    //c和lua交互部分
    lua_pushcfunction(L, my_add);
    lua_setglobal(L, "madd"); // lua中调用时 print(madd(10,20))

    luaL_register(L, "mylib", mylib); // lua中调用时 local lib require "mylib" print(lib.madd(10,20))

    //============================================
    //lua调用c函数
    // 参考上面
    //============================================
    //c调用lua函数
    lua_getglobal(L, "math");
    //lua_pushstring(L, "min");
    lua_getfield(L, -1, "pow");
    if (lua_isfunction(L, -1))
    {
        lua_pushinteger(L, 3);
        lua_pushinteger(L, 2);
        lua_call(L, 2, 1);
        printf("result:%d\n", lua_tointeger(L, -1));
        lua_pop(L, 1);
    }

    //============================================
    //c中操作lua的表, 索引和kv操作
    lua_newtable(L);
    lua_pushstring(L, "key");
    lua_pushstring(L, "mm");
    //由于上面两次压栈,现在table元素排在栈顶往下数第三的位置
    lua_settable(L, -3);    //lua_settable会自己弹出上面压入的key和value

    for (int i = 1; i < 10; i++) {
        lua_pushinteger(L, i);
        //lua_pushstring(L, "gogoxxxx" + i);
        lua_pushfstring(L, "gogoxxxx%d", i);
        lua_settable(L, -3);
    }

    lua_setglobal(L, "mk");  //lua_settable会自己弹出上面压入的key和value

    //============================================
    //c中遍历lua的表
    lua_getglobal(L, "mk");
    size_t n = lua_objlen(L, -1);
    for (int i = 1; i <= n; ++i) {
        lua_pushinteger(L, i);
        lua_gettable(L, -2);
        printf("mk[%d] = %s\n", i, lua_tostring(L, -1));
        lua_pop(L, 1);
    }

    printf("========================================\n");
    int nIndex = lua_gettop(L);  // 取 table 索引值 
    lua_pushnil(L);  // nil 入栈作为初始 key 
    while (0 != lua_next(L, nIndex))
    {
        printf("mk[N] = %s\n", lua_tostring(L, -1));
        lua_pop(L, 1);  // 弹出 value,让 key 留在栈顶 
    }
    // 现在栈顶是 table

    lua_pushstring(L, "=====>");
    lua_setglobal(L, "kkm");

    luaL_dofile(L, "test.lua");

    lua_close(L);
    system("pause");
    return 0;
}

lua脚本部分


local lib = require "mylib"
print("gogo");

print(mk.key);
print(mk[1]);
print(kkm);

print(madd(100, 20))

print(lib.madd(120, 20))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值