Я также работаю над этим на основе макро решения. Так что это только для самых смелых, я думаю ;-) Но это уже довольно приятно, и я уже работаю над несколькими проектами в дополнение к этому.
Это работает так, что вы сначала определяете отдельный заголовочный файл для каждого класса. Как это:
#define CLASS Point
#define BUILD_JSON
#define Point__define \
METHOD(Point,public,int,move_up,(int steps)) \
METHOD(Point,public,void,draw) \
\
VAR(read,int,x,JSON(json_int)) \
VAR(read,int,y,JSON(json_int)) \
Чтобы реализовать класс, вы создаете для него заголовочный файл и файл C, в котором вы реализуете методы:
METHOD(Point,public,void,draw)
{
printf("point at %d,%d\n", self->x, self->y);
}
В заголовок, который вы создали для класса, вы включаете другие нужные вам заголовки и определяете типы и т. Д., Относящиеся к классу. И в заголовке класса, и в файле C вы включаете файл спецификации класса (см. Первый пример кода) и X-макрос. Эти X-макросы ( 1 , 2 , 3 и т. Д.) Расширяют код до фактических структур классов и других объявлений.
Чтобы наследовать класс, #define SUPER supername
и добавьте supername__define \
в качестве первой строки в определении класса. Оба должны быть там. Также есть поддержка JSON, сигналы, абстрактные классы и т. Д.
Чтобы создать объект, просто используйте W_NEW(classname, .x=1, .y=2,...)
. Инициализация основана на инициализации структуры, представленной в C11. Это работает хорошо, и все, что не перечислено, установлено в ноль.
Чтобы вызвать метод, используйте W_CALL(o,method)(1,2,3)
. Это похоже на вызов функции более высокого порядка, но это просто макрос. Он расширяется до ((o)->klass->method(o,1,2,3))
, что является действительно хорошим хаком.
См. Документация и сам код .
Так как фреймворку нужен некоторый шаблонный код, я написал Perl-скрипт (wobject), который выполняет эту работу. Если вы используете это, вы можете просто написать
class Point
public int move_up(int steps)
public void draw()
read int x
read int y
и он создаст файл спецификации класса, заголовок класса и файл C, который включает Point_impl.c
, где вы реализуете класс. Это экономит много работы, если у вас много простых классов, но все еще в C. wobject - очень простой сканер на основе регулярных выражений, который легко адаптировать к конкретным потребностям или переписать с царапина.