모듈 방식은 일반적으로 매우 휴대하기 편리하므로 (휴대 가능하고 깨끗합니다) 가능한 다른 모듈과 독립적으로 모듈을 프로그래밍하려고합니다. 내 접근 방식의 대부분은 모듈 자체를 설명하는 구조체를 기반으로합니다. 초기화 함수는 기본 매개 변수를 설정 한 후 처리기 (Desriptive 구조체에 대한 포인터)가 모듈 내부의 모든 함수에 전달됩니다.
지금은 모듈을 설명하는 구조체에 대한 할당 메모리의 최선의 접근법이 무엇인지 궁금합니다. 가능한 경우 다음을 원합니다.
- 불투명 한 구조체이므로 제공된 인터페이스 함수를 사용해야 만 구조체를 변경할 수 있습니다.
- 여러 인스턴스
- 링커가 할당 한 메모리
다음과 같은 가능성이 있습니다. 모두 나의 목표 중 하나와 충돌합니다.
글로벌 선언
링커에 의해 모두 할당 된 여러 인스턴스 이지만 구조체는 불투명하지 않습니다.
(#includes)
module_struct module;
void main(){
module_init(&module);
}
Malloc
불투명 구조체, 다중 인스턴스, 힙에 할당
module.h에서 :
typedef module_struct Module;
module.c init 함수, malloc 및 할당 된 메모리에 대한 포인터 반환
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
main.c에서
(#includes)
Module *module;
void main(){
module = module_init();
}
모듈 선언
링커가 할당 한 불투명 구조체, 사전 정의 된 수의 인스턴스 만
전체 구조체와 메모리를 모듈 내부에 유지하고 핸들러 또는 구조체를 노출시키지 마십시오.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
힙 할당 대신에 다중 구조체와 여러 인스턴스를 불투명 구조체, 링커에 대해 어떻게 든 결합 할 수 있습니까?
해결책
아래의 답변에서 제안한 것처럼 가장 좋은 방법은 다음과 같습니다.
- 모듈 소스 파일에서 MODULE_MAX_INSTANCE_COUNT 모듈의 예약 공간
- 모듈 자체에서 MODULE_MAX_INSTANCE_COUNT를 정의하지 마십시오
- #ifndef MODULE_MAX_INSTANCE_COUNT # 오류를 모듈 헤더 파일에 추가하여 모듈 사용자가이 제한 사항을 인식하고 애플리케이션에 필요한 최대 인스턴스 수를 정의하도록하십시오.
- 인스턴스를 초기화하면 설명 적 구조체의 메모리 주소 (* void) 또는 모듈 인덱스 (더 좋아하는 것)를 반환합니다