Tôi đang tạo api C mà giấu đi một số chức năng trong một tập tin DLL.Các loại phù hợp với tay cầm ở giao diện C
Kể từ khi tất cả mọi thứ là C++ ở bên trong hầu hết các chức năng làm việc chống lại xử lý mà bản đồ trực tiếp đến con trỏ này vào bên trong API.
Để có được một mức độ nào đó của loại an toàn cho những tay nắm tôi định nghĩa chúng như thế này:
typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;
Tôi không thực sự xác định MyType1 hoặc MyType2 ở bất cứ nơi nào kể từ khi tôi chỉ sử dụng chúng như con trỏ và làm một gõ vào bên trong của api để loại con trỏ thực tế.
Vấn đề của tôi là khi sử dụng thư viện của tôi trong một dự án clr trong visual studio tôi có được điều này warning: unresolved typeref token (token) for 'type'; image may not run.
http://msdn.microsoft.com/en-us/library/h8027ys9(VS.80).aspx
Đó là không có vấn đề lớn vì nó hoạt động, nhưng có vẻ không chuyên nghiệp.
tôi không thích sử dụng void *:
typedef void* MyType1Handle;
typedef void* MyType2Handle;
Điều này làm cho nó có thể để gọi một chức năng muốn một MyType1Handle với một MyType2Handle kể từ khi họ thực sự là cùng loại.
Một cách tiếp cận tôi không muốn sử dụng là một cái gì đó như thế này
typedef int MyType1Handle;
typedef int MyType2Handle;
này sẽ làm việc tốt miễn là int và con trỏ có cùng kích thước, nhưng đó không phải luôn luôn như vậy và nó có vẻ như có là không có cách nào dễ dàng để có được một con số cụ thể có kích thước nền tảng con trỏ. Nó cũng có cùng các vấn đề an toàn như void *.
Một cách tiếp cận tôi đã cố gắng là để làm điều đó như thế này:
struct MyType1{};
typedef struct MyType1* MyType1Handle;
này đã không làm việc trong C kể từ khi cấu trúc rỗng là mã C không hợp lệ. Tôi tất nhiên có thể mở rộng cấu trúc của tôi với một thành viên giả, nhưng nó có vẻ như cần phải có một cách tốt hơn để làm điều này.
Vì vậy, câu hỏi của tôi tóm tắt:
Bạn thường chỉ định loại kiểu này theo cách tương thích nhất?
Cảm ơn câu trả lời. Có vẻ như tôi không phải là người đầu tiên gặp vấn đề này ít nhất :) – Laserallan
Một điểm khác biệt ở đây là trong các tiêu đề công khai, loại HANDLE tham chiếu đến một loại cụ thể. Cấu trúc giả được định nghĩa hoàn toàn. Tất nhiên, chúng xác định DECLARE_HANDLE khác nhau khi bao gồm các tệp đó trong quá trình triển khai. – RBerteig