lua入门教程:第八章 C API 注册c函数

了解了栈的操作以后,为了扩展lua的功能,需要在c层上编程函数,让lua进行调用,需要把c语言函数注册到lua中。

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

#include   
using namespace std;

static int average(lua_State *L)
{
	/* get number of arguments */
	int n = lua_gettop(L);
	double sum = 0;
	int i;
	/* loop through each argument */
	for (i = 1; i <= n; i++)
	{
		if (!lua_isnumber(L, i))
		{
			lua_pushstring(L, "Incorrect argument to 'average'");
			lua_error(L);
		}
		/* total the arguments */
		sum += lua_tonumber(L, i);
	}

	/* push the average */
	lua_pushnumber(L, sum / n); //第一个返回值

								/* push the sum */
	lua_pushnumber(L, sum); //第二个返回值

							/* return the number of results */
	return 2;
}

int main()
{
	int error;
	lua_State* L = luaL_newstate();
	luaL_openlibs(L);

	lua_register(L, "average", average);

	int ret = luaL_dofile(L, "average.lua");
	if (ret != 0)
	{
		printf("%s", lua_tostring(L, -1));
	}

	lua_close(L);

    return 0;
}

lua的代码如下:

avg, sum = average(20,40,50,60,80)

print("The average is ", avg)

print("The sum is ", sum)

新定义一个average函数,需要返回一个返回值的个数。在这个我们返回了两个值,一个是和一个是平均值。所以return 2。在luaL_dofile之前我们需要把average函数注册到lua中去,让lua进行调用。lua_register就是用来注册函数的。注册完成以后,lua中就能够使用average函数了。我们可以看看lua_register到底是做了什么事情。

lua.h中,这样定义 lua_register的,

#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))

lua_register 其实是两个函数一个是lua_pushcfunction 另一个是 lua_setglobal

这其实跟我们全局表参数的使用是一样的,先lua_pushcfunction把函数压到栈顶,在使用lua_setglobal把函数设置为“全局变量”。lua代码就能够“认识”这个函数了。

你可能感兴趣的:(lua入门教程,lua)