Учитывая, насколько надежен 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. Я надеюсь, что вы сможете найти для этого отличное применение в своих собственных приложениях.