Я також працюю над цим на основі макророзв’язку. Отож, це тільки для найсміливіших; я думаю ;-) Але це вже цілком приємно, і я вже працюю над кількома проектами над цим. Це працює так, що ви спочатку визначите окремий файл заголовка для кожного класу. Подобається це:
#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))
чого це справді приємний злом.
Див. Документацію та сам код .
Оскільки фреймворку потрібен якийсь код коробки, я написав сценарій (wobject) Perl, який виконує цю роботу. Якщо ви використовуєте це, ви можете просто написати
class Point
public int move_up(int steps)
public void draw()
read int x
read int y
і він створить файл специфікації класу, заголовок класу та файл C, який включає, Point_impl.c
де ви реалізуєте клас. Це економить досить багато роботи, якщо у вас багато простих класів, але все-таки все є у C. wobject - це дуже простий сканер на основі регулярних виразів, який легко адаптуватися до конкретних потреб або переписати з нуля.