Как использовать оператор ... в lua с кодом C - PullRequest
0 голосов
/ 05 августа 2010

У меня есть функция, которая принимает переменное число аргументов в C, которые я хочу передать другой функции lua.В чистом Lua я мог бы сделать что-то вроде этого

function foo(...)
    print(...)
end

Как бы я сделал то же самое, если бы мне пришлось реализовать функцию в C?

Редактировать: Я мог бы сформулировать это плохоТо, что я хочу сделать, это написать функцию foo выше, в C, используя Lua API, но я не знаю, как передать аргументы, которые я получаю из стека Lua, в печать, потому что я не знаю, сколько ихи я не могу найти способ проверить.

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

Для проверки количества аргументов в стеке используется функция lua_gettop().

Попробуйте выполнить следующее из функции C:

lua_getfield(L, LUA_GLOBALSINDEX, "print");
lua_insert(L, 1);
lua_call(L, lua_gettop(L)-1, 0);

lua_call()извлеките все аргументы из стека, поэтому, если вы хотите сохранить их, вам нужно будет немного изменить их, чтобы сделать копию всех аргументов.

int args=lua_gettop(L);
if(lua_checkstack(L, args+1))
{
  int i;
  lua_getfield(L, LUA_GLOBALSINDEX, "print");
  for(i=1;i<=args;i++)
    lua_pushvalue(L, i);
  lua_call(L, args, 0);
}
else
{
  return luaL_error(L, "cannot grow stack");
}
2 голосов
/ 05 августа 2010

Все функции C, которые можно вызывать на языке lua, должны иметь тип lua_CFunction:

typedef int (*lua_CFunction) (lua_State *L);

lua_State может содержать переменное количество аргументов, как показано в §3.7 Справочного руководства Lua 5.1. Вы не можете использовать «нормальную» функцию C vararg.

1 голос
/ 05 августа 2010

Прочитав немного дальше по ссылке Скотта, я думаю, что ответил на свой вопрос. lua_gettop сообщит мне количество переданных аргументов, поэтому я знаю, что нужно поместить в стек для внутренней функции.

Я просто не ожидал, что функция проверит размер стека, который будет называться "gettop". Я бы ожидал "контрольный стек" или что-то, но это делает что-то еще полностью.

...