1. 程式人生 > >lua 5.2 實現luaL_register 功能

lua 5.2 實現luaL_register 功能

lua 5.2 去掉了luaL_register功能,不能直接註冊函式到一個全域性table中了。

網上找了很多文章都是要匯出到庫,再引用庫。

// my_math.c
  
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
  
#include <math.h>
#include <stdio.h>
  
  
static int my_math_sin (lua_State *L) {
lua_pushnumber(L, sin(luaL_checknumber(L, 1)));
return 1;
}
  
static int my_math_cos (lua_State *L) {
lua_pushnumber(L, cos(luaL_checknumber(L, 1)));
return 1;
}
  
  
static const luaL_Reg mathlib[] = {
{"my_cos",   my_math_cos},
{"my_sin",   my_math_sin},
{NULL, NULL}
};
  
/*
** Open my_math library
*/
LUALIB_API int luaopen_my_math (lua_State *L) {
  luaL_newlib(L, mathlib);
  return 1;
}

LUALIB_API 是匯出匯入函式或extern,看是否指定 LUA_BUILD_AS_DLL

// callc.lua
  
my_math = require("my_math") --my_math 是一個dll或so,由下面的.c生成 
  
print(my_math.my_sin(3.14))
print(my_math.my_cos(3.14))

如果要實現luaL_register,可以不匯出dll,改用luaL_requiref在c裡面註冊這個load方法

luaL_requiref(L,"my_math",luaopen_my_math,0);
這樣就不用匯出dll了,直接在exe裡就行了