Учитывая, насколько надежен Lua при использовании в качестве самостоятельного языка, некоторые люди могут быть удивлены, узнав, что Lua на самом деле задуман как библиотека для расширения функциональности C. В этом посте я расскажу об одном из многих способов, с помощью которых Lua может расширить функциональность C, используя его для настройки некоторых переменных в C.
(Обратите внимание, этот пост предполагает, что читатель знаком с основами программирования на C)
Прежде чем мы начнем использовать Lua для настройки переменных, нам нужно будет охватить основы того, как использовать Lua в C. Первое, что нам нужно добавить в программу C, — это заголовки Lua.
#include <lua.h> #include <lauxlib.h> #include <lualib.h>
Эти заголовочные файлы содержат все функциональные возможности, необходимые для использования Lua в C, лично я бы рекомендовал включить все 3 по умолчанию. lua.h содержит ядро Lua, и в том числе требуется для любых действий с Lua. lauxlib.h является вспомогательной библиотекой для Lua и содержит некоторые расширенные функции, необходимые для стандартных библиотек Lua, которые можно открыть, включив заголовок lualib.h.
Теперь, когда у вас есть необходимые заголовки, вам нужно открыть Lua следующей строкой:
lua_State *L = luaL_newstate(); //In older versions of Lua, you would use lua_open()
Это создает указатель на пустую среду Lua (состояние A.K.A.) с именем L. Прежде чем мы сможем сделать что-нибудь полезное с этой средой, нам нужно определить некоторые функции для использования, открыв библиотеки Lua.
luaL_openlibs(L); //Again, in older versions, each Lua library is opened individually
Теперь, когда у нас есть пригодная для использования среда Lua, мы можем начать обмен значениями между нашим кодом C и Lua. Но как мы это делаем? Ответ — «Стек». Стек может быть заполнен любым значением Lua, а затем доступен как для среды Lua, так и для среды C. Когда вы хотите отправить значение в Lua, вы помещаете значение в стек, а затем вызываете Lua, чтобы извлечь его. Когда вы хотите получить значение из Lua, вы вызываете Lua для отправки значения, а затем извлекаете его в C. Чтобы поддерживать согласованность типов данных этих значений, мы используем разные функции для отправки и получения каждого типа данных. Еще одна важная вещь, которую следует отметить, заключается в том, что Lua может только вставлять и выталкивать стек, в то время как C может работать в любом месте структуры стека.
При использовании Lua в качестве языка конфигурации нас больше всего беспокоит получение значений из нашего файла конфигурации Lua. В следующем коде показано, как выполнить эту задачу.
Наш файл конфигурации Lua config.lua
width = 720 height = 360
Соответствующий код в нашем приложении C windowDemo.c
//Open Lua Environment lua_State *L = luaL_newstate(); //Open Lua Libraries luaL_openlibs(L); //Load the Lua config file in the Lua Environment luaL_loadfile(L, “C:/users/ItsMe/Desktop/config.txt”) || lua_pcall(L, 0, 0, 0); //Get the value of a Lua Global Variable called height, and push //onto the stack. lua_getglobal(L, “width”); //Notice that almost all of the C functions that interact with Lua //will ask for the Lua environment as a parameter. lua_getglobal(L, “height”); //Get the value at depth 2 of The Stack and parse it as an //integer. int width = lua_tonumber(L, -2); //I like to think of this stack as a pit that you’re dropping //plates into, it makes the negative numbers a bit easier to //understand. int height = lua_tonumber(L, -1); //Close the Lua Environment and release resources. lua_close(L);
Теперь, когда вы получили значения из конфигурационного файла Lua, вы можете использовать их где угодно в вашем приложении C.
Последнее, что нам нужно рассмотреть, — это дополнительные параметры компилятора, необходимые для компиляции приложения C, использующего библиотеки Lua. Это имеет тенденцию варьироваться от системы к системе и от компилятора к компилятору, но утверждение, которое сработало для меня, было следующим:
gcc –o luaWin windowDemo.c –I<path to Lua header files> L<path to Lua libraries> -llua
Замените приведенные выше части в квадратных скобках путями к этим файлам на вашем компьютере, и это должно работать, если вы используете компилятор GNU C. Другие компиляторы будут работать очень похожим образом.
Я надеюсь, что этот пост был полезен для изучения того, как использовать Lua в качестве языка конфигурации C. Я надеюсь, что вы сможете найти для этого отличное применение в своих собственных приложениях.