#lua
Многие функции системного программирования в linux работают с флагами (например, O_NONBLOCK). Но эти флаги же надо ещё и получить! Насколько я понимаю, флаги в заголовочных файлах определены при помощи #define. Традиционное нечто вроде ffi.C.O_NONBLOCK выдаёт ошибку, это не функция и не глобальная переменная! При этом файл заголовков подгружен при помощи библиотеки lcpp. И как же получить эти самые define'ы?
Ответы
Ответ 1
Надо использовать не ffi.C. а ffi.lcpp_defs.. Пример 1 Файл test1.lua: local lcpp = require("lcpp") local ffi = require("ffi") ffi.cdef([[ #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; } test_t; ]]) print("MAX_SIZE = " .. ffi.lcpp_defs.MAX_SIZE) Результат работы: MAX_SIZE = 100 Пример 2 Файл test2.lua: local lcpp = require("lcpp") local ffi = require("ffi") ffi.cdef("#include \"test.h\"") print("FREQUENCY_MHZ = " .. ffi.lcpp_defs.FREQUENCY_MHZ) print("FREQUENCY_KHZ = " .. ffi.lcpp_defs.FREQUENCY_KHZ) print("_PACKED_ = " .. ffi.lcpp_defs._PACKED_) Файл test.h: #ifndef TEST_H #define TEST_H #define FREQUENCY_MHZ 2 #define FREQUENCY_KHZ (FREQUENCY_MHZ * 1000) #define _PACKED_ __attribute__((packed)) #endif // TEST_H Результат работы: FREQUENCY_MHZ = 2 FREQUENCY_KHZ = (FREQUENCY_MHZ * 1000) _PACKED_ = __attribute__((packed)) Всё в общем-то работает, но из второго примера видно, что полного препроцессинга define'ов не происходит. На самом деле тут всё не так плохо. Пример 3 Файл test3.lua: local ffi = require("ffi") local lcpp = require("lcpp") local data, state = lcpp.compile([[ #define ROW_CNT 0x0F #define COL_CNT 0x0A #define DATA_CNT (ROW_CNT * COL_CNT) int data[DATA_CNT]; ]]) local data_type = ffi.typeof(data) print("data = " .. data) print("ROW_CNT = " .. state.defines.ROW_CNT) print("COL_CNT = " .. state.defines.COL_CNT) print("DATA_CNT = " .. state.defines.DATA_CNT) print("typeof(data) = " .. tostring(data_type)) Результат работы: data = int data[(15*10)]; ROW_CNT = 0x0F COL_CNT = 0x0A DATA_CNT = (ROW_CNT * COL_CNT) typeof(data) = ctypeКак видно из этого примера, размерность массива вычислена правильно (150 элементов).
Комментариев нет:
Отправить комментарий