2012-04-16 17 views
6

Tôi đang cố gắng sử dụng macro C từ Vala. Dường như với tôi rằng điều này nên có thể với các chỉ thị CCode nhưng tôi không tìm thấy bất kỳ tài liệu có ý nghĩa về cách sử dụng nó.Làm cách nào để sử dụng thuộc tính CCode trong Vala?

Có một phần ngắn gọn về các đối số CCode trong "The Hacker's Guide to Vala"mailing list thread about calling a C macro from Vala with CCode.

Nhưng không phải tài nguyên nào thực sự giúp tôi hiểu những gì CCode thực sự làm. Nó rõ ràng ảnh hưởng đến cách Vala tạo mã C, từ Hackers' Guide to Vala Tôi có thể suy ra rằng chỉ thị CCode có thể mang lại cho tôi ảnh hưởng trực tiếp đến cách cây CCode được tạo ra khi đi qua Valas AST.

Ai đó có thể giải thích thêm một chút về CCode không?

+1

Tôi tìm thấy thêm tài liệu: https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute –

Trả lời

8

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.

Các vấn đề liên quan