CreateEntity是我在项目中绑定到Lua的C函数。它将实体类名称字符串作为第一个参数,并将任何数量的其他参数传递给所选实体的构造函数。
例如,如果CreateEntity是一个普通的Lua函数,我可以这样做:
function CreateEntity( class, ... )
-- (choose a constructor function based on class)
args = {...}
-- (store args somewhere for whatever reason)
TheConstructor( ... )
end
但是我怎么能用C Lua函数做到这一点?
答案 0 :(得分:4)
C函数lua_gettop将返回传递给C函数的参数数量。您必须从堆栈中读取所有内容并将它们存储在C数据结构中,或者将它们放在Lua注册表中(请参阅Registry和luaL_ref)并存储对它们的引用以供以后使用。下面的示例程序使用注册表方法。
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include <stdio.h>
#include <stdlib.h>
/* this function prints the name and extra variables as a demonstration */
static void
TheConstructor(lua_State *L, const char *name, int *registry, int n)
{
int i;
puts(name);
for (i = 0; i < n; ++i) {
lua_rawgeti(L, LUA_REGISTRYINDEX, registry[i]);
puts(lua_tostring(L, -1));
}
free(registry);
}
static int
CreateEntity(lua_State *L)
{
const char *NAME = luaL_checkstring(L, 1);
int *registry;
int i, n;
/* remove the name parameter from the stack */
lua_remove(L, 1);
/* check how many arguments are left */
n = lua_gettop(L);
/* create an array of registry entries */
registry = calloc(n, sizeof (int));
for (i = n; i > 0; --i)
registry[i-1] = luaL_ref(L, LUA_REGISTRYINDEX);
TheContructor(L, NAME, registry, n);
return 0;
}
int
main(int argc, char **argv[])
{
const char TEST_CHUNK[] =
"CreateEntity('foo', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)";
lua_State *L;
L = luaL_newstate();
lua_register(L, "CreateEntity", CreateEntity);
luaL_dostring(L, TEST_CHUNK);
lua_close(L);
return EXIT_SUCCESS;
}
答案 1 :(得分:1)
args = {...}
-- (store args somewhere for whatever reason)
The arguments of the call are on the Lua stack你可以随意使用它们:将它们放在你自己的结构中(std::vector<boost::any>
或类似的东西)或将个别参数存储在the Lua registry中或创建一个带有参数的Lua表并将其存储在注册表中。什么更适合你?
TheConstructor( ... )
我相信这部分在C ++中不可能像Lua那样。 C ++需要在编译时传递给函数的参数数量。
尝试用C ++做这些事情是一个很大的不便。如果你告诉我们为什么你希望你的CreateEntity函数在C ++端而不是Lua上,那么可能会更好。