phương pháp tiếp cận mô-đun khá tiện dụng nói chung (di động và sạch sẽ), vì vậy tôi cố gắng lập trình các mô-đun độc lập với bất kỳ mô-đun nào khác có thể. Hầu hết các cách tiếp cận của tôi dựa trên một cấu trúc mô tả chính mô-đun. Hàm khởi tạo đặt các tham số chính, sau đó một trình xử lý (con trỏ tới cấu trúc mô tả) được truyền cho bất kỳ hàm nào bên trong mô-đun được gọi.
Ngay bây giờ, tôi tự hỏi cách tiếp cận tốt nhất của bộ nhớ phân bổ cho cấu trúc mô tả một mô-đun có thể là gì. Nếu có thể, tôi muốn như sau:
- Cấu trúc mờ, do đó, cấu trúc chỉ có thể được thay đổi bằng cách sử dụng các chức năng giao diện được cung cấp
- Nhiều trường hợp
- bộ nhớ được phân bổ bởi liên kết
Tôi thấy các khả năng sau đây, rằng tất cả xung đột với một trong những mục tiêu của tôi:
tuyên bố toàn cầu
nhiều trường hợp, được phân bổ bởi trình liên kết, nhưng struct không mờ
(#includes)
module_struct module;
void main(){
module_init(&module);
}
trung tâm thương mại
cấu trúc mờ, nhiều trường hợp, nhưng allcotion trên heap
trong mô-đun.h:
typedef module_struct Module;
trong hàm module.c init, malloc và trả về con trỏ tới bộ nhớ được cấp phát
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
trong main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
khai báo trong mô-đun
cấu trúc mờ, được phân bổ bởi trình liên kết, chỉ một số trường hợp được xác định trước
giữ toàn bộ cấu trúc và bộ nhớ trong cho mô-đun và không bao giờ để lộ trình xử lý hoặc cấu trúc.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Có một tùy chọn để kết hợp những thứ này bằng cách nào đó cho cấu trúc mờ, trình liên kết thay vì phân bổ heap và nhiều / bất kỳ số lượng phiên bản nào không?
giải pháp
như đề xuất trong một số câu trả lời dưới đây, tôi nghĩ cách tốt nhất là:
- không gian dự trữ cho các mô-đun MODULE_MAX_INSTANCE_COUNT trong tệp nguồn mô-đun
- không xác định MODULE_MAX_INSTANCE_COUNT trong chính mô-đun
- thêm một #ifndef MODULE_MAX_INSTANCE_COUNT #error vào tệp tiêu đề mô-đun để đảm bảo người dùng mô-đun nhận thức được giới hạn này và xác định số lượng phiên bản tối đa muốn cho ứng dụng
- khi khởi tạo một thể hiện trả về địa chỉ bộ nhớ (* void) của cấu trúc mô tả hoặc chỉ mục mô-đun (bất cứ điều gì bạn thích hơn)