2014-05-12 1 views
0

아마도 잘못된 질문을하고 있지만 다음 디자인 (간결성을 위해 제거 된 가드 포함)을 사용하려고합니다.마스터 구조체 및 종속성

/* config.h */ 
#include "foo.h" 
#include "bar.h" 

struct config { 
    struct foo foo; 
    struct bar bar; 
    ... 
}; 

/* foo.h */ 
#include "config.h" 
struct foo { 
    ... 
}; 

void foo_something(struct config *, ...); 

/* bar.h */ 
#include "config.h" 
struct bar { 
    ... 
}; 

void bar_something(struct config *, ...); 

/* main.c */ 
int main(void) 
{ 
    struct config config; 
    /* initialize struct */ 
    foo_something(&config); 
    bar_something(&config); 
    print_config(&config); 
} 

이것은 순환 의존성 문제입니다. 앞으로 선언문을 추가하고 #include "config.h"을 파일의 맨 아래로 옮겨서 제대로 작동하도록 만들 수 있지만, 제대로 된 것은 아닙니다. 이 모든 구조체는 이전에는 같은 파일에 있었지만 모듈화를 향상시키기 위해 해체하고 싶었습니다.

이 문제를 방지하려면 더 나은 설계 방법이나 더 좋은 디자인 패턴이 있습니까?

FWIW, 내 대상 플랫폼은 마이크로 컨트롤러이므로 동적 할당과 전역을 피하려고합니다.

답변

0

일반적으로 전달 선언은 갈 수있는 방법입니다. foo_somethingbar_somethingconfig의 각 부분을 필요로하는 경우 귀하의 경우에는,

foo_something(&config.foo); 
bar_something(&config.bar) 

훨씬 더 간단 것으로 보인다. 그렇지 않은 경우 struct foostruct bar은 별도의 헤더 파일을 보증 할만큼 충분히 독립적입니다.

그건 그렇고, 세부 사항은 거의 알려지지 않은 것이 사실입니다.

+0

대부분의 경우 각 파일은 해당 구조체 만 사용하는 경향이 있습니다. 그러나 모든 구조체가 필요한 함수를 호출하는 위치는 1 ~ 2 개입니다. – Balthamos

+0

나는 그 1 또는 2 개의 장소를 재 설계하는 방법에 집중할 것입니다. 기능상의 명확한 구분이 없다면 별도의 데이터가 없습니다. 애매한 것에 대해 유감스럽게 생각합니다. 더 자세한 내용을 말하면 아마도 더 잘 조언 할 것입니다. – user58697