Tôi cũng đang làm việc trên cơ sở này dựa trên một giải pháp vĩ mô. Vì vậy, nó chỉ dành cho những người dũng cảm nhất ,-) Nhưng nó đã khá tốt rồi, và tôi đã làm việc với một vài dự án trên nó. Nó hoạt động để trước tiên bạn xác định một tệp tiêu đề riêng cho mỗi lớp. Như thế này:
#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)) \
Để thực hiện lớp, bạn tạo một tệp tiêu đề cho nó và một tệp C nơi bạn thực hiện các phương thức:
METHOD(Point,public,void,draw)
{
printf("point at %d,%d\n", self->x, self->y);
}
Trong tiêu đề bạn đã tạo cho lớp, bạn bao gồm các tiêu đề khác bạn cần và xác định các loại, v.v. liên quan đến lớp. Trong cả tiêu đề lớp và trong tệp C, bạn bao gồm tệp đặc tả lớp (xem ví dụ mã đầu tiên) và macro X. Các macro X ( 1 , 2 , 3 , v.v.) sẽ mở rộng mã thành các cấu trúc lớp thực tế và các khai báo khác.
Để kế thừa một lớp #define SUPER supername
và thêmsupername__define \
làm dòng đầu tiên trong định nghĩa lớp. Cả hai phải ở đó. Ngoài ra còn có hỗ trợ JSON, tín hiệu, các lớp trừu tượng, v.v.
Để tạo một đối tượng, chỉ cần sử dụng W_NEW(classname, .x=1, .y=2,...)
. Việc khởi tạo dựa trên khởi tạo cấu trúc được giới thiệu trong C11. Nó hoạt động độc đáo và mọi thứ không được liệt kê được đặt thành không.
Để gọi một phương thức, sử dụng W_CALL(o,method)(1,2,3)
. Nó trông giống như một lệnh gọi hàm cao hơn nhưng nó chỉ là một macro. Nó mở rộng đến((o)->klass->method(o,1,2,3))
đó là một hack thực sự tốt đẹp.
Xem Tài liệu và mã chính nó .
Vì khung cần một số mã soạn sẵn, tôi đã viết một tập lệnh Perl (wobject) thực hiện công việc. Nếu bạn sử dụng nó, bạn chỉ có thể viết
class Point
public int move_up(int steps)
public void draw()
read int x
read int y
và nó sẽ tạo tệp đặc tả lớp, tiêu đề lớp và tệp C, bao gồm Point_impl.c
nơi bạn triển khai lớp. Nó tiết kiệm khá nhiều công việc, nếu bạn có nhiều lớp đơn giản nhưng mọi thứ vẫn ở C. wobject là một trình quét dựa trên biểu thức chính quy rất đơn giản, dễ thích ứng với các nhu cầu cụ thể hoặc được viết lại từ đầu.