Thật không may, không có nhiều tài liệu về CCode có ý nghĩa một mình. Những gì bạn cần làm là sử dụng nó kết hợp với các tập tin VAPI đi kèm với Vala. Tại hầu hết các cơ bản của nó, có thể bạn sẽ sử dụng cái gì macro của bạn như thế này:
[CCode(cname = "FOO", cheader_filename = "blah.h")]
public extern void foo();
Ở đây chúng ta đang thiết lập các cname
(ví dụ, tên sẽ được phát ra vào mã C), và cheader_filename
(tức là, tệp tiêu đề phải là #include
d). Hầu hết các thuộc tính CCode khác đều kiểm soát cách xử lý các mảng. array_length = false
cho biết rằng một mảng có chiều dài không xác định. Điều này có thể được áp dụng cho một tham số hoặc phương thức, chỉ ra rằng nó được áp dụng cho kiểu trả về. Ví dụ:
[CCode(array_length = false)] public int[] x();
[CCode(array_null_terminated = true)] public FileStream[] y();
public int[] z();
Trong ví dụ này, x
sẽ có chiều dài mảng không rõ và có một nguyên mẫu C dự kiến của int *x(void)
, trong khi y
được giả định là có một mảng null-chấm dứt với nguyên mẫu C dự kiến của FILE **y(void)
. Cuối cùng, z
được giả định là có một chiều dài mảng ra tham số (ví dụ, một nguyên mẫu của int *z(int *length)
, nơi length
là một con trỏ đến nơi lưu trữ theo chiều dài của mảng được trả về.
Tất cả những có thể được áp dụng cho các thông số quá. Nó cũng hữu ích để chỉ định array_length_pos
nếu có độ dài mảng nhưng nó không phải là đối số ngay sau mảng đó.Nếu tham số là đại biểu, target_pos
chỉ định nơi dữ liệu người dùng được chuyển (tức là, void*
đi kèm với con trỏ hàm)
Ngoài ra còn có nhiều thuộc tính CCode khác nhau để sử dụng với các đại biểu, lớp và cấu trúc. class/struct instance hoặc dữ liệu người dùng ủy nhiệm. Tất cả các đối số vị trí được xác định bằng một số dấu phẩy động. Điều này cho phép nhiều vị trí được mã hóa. Ví dụ, giả sử chúng ta có một nguyên mẫu C:
void foo(void* userdata, int length, double *dbl_array, void(*handler)(double,void*));
sau đó chúng ta có thể viết này:
[CCode(cname = "foo")]
public void foo([CCode(array_length_pos = 0.2)] double[] array, [CCode(target_pos = 0.1)] Handler func);
Với Handler
được định nghĩa là một đại biểu ở nơi khác, bạn có thể thấy rằng pos
giá trị đặt các đối số sau đối số 0 (tức là, bắt đầu) và sau đó theo một thứ tự cụ thể.
Các lớp và cấu trúc có chức năng xử lý việc khởi tạo, hủy và tính tham chiếu, nhưng chúng khá thẳng về phía trước. Xử lý Generics cũng là một chút phức tạp. Một lần nữa, các VAPI là nguồn thông tin chi tiết tốt nhất.Tuy nhiên, đó là đủ để giúp bạn bắt đầu trên các hàm và macro cơ bản của C.
Tôi tìm thấy thêm tài liệu: https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute –