2012-01-07 4 views
1

I가 다음 두 구조체 :초기화 중첩 된 구조체 - 가장 좋은 방법

typedef struct foo__ 
{ 
    double *cliendata; 
    size_t len; 
    size_t f1; 
    size_t f2; 
}Foo; 

typedef struct foobar__ 
    Foo a, b, c; 
    char[SOME_DIM] name; 
    size_t fb1; 
    size_t fb2; 
    char[SOME_DIM] address; 
    Foo d; 
    unsigned char id; 
}FooBar; 

나는, 나는 그것이 모든 필드 멤버를 초기화하기 때문에 (더 "올바른"라고 생각하기 때문에 EMPTY_FOOBAR2를 사용하는 것을 선호 플러스 (나는?

#define EMPTY_FOO { NULL, 0, 0, 0} 
#define EMPTY_STRING {""} 
#define EMPTY_FOOBAR1 { {0},{0},{0}, {""}, 0, 0, {""}, {0}, 0} 

#define EMPTY_FOOBAR2 { EMPTY_FOO, EMPTY_FOO, EMPTY_FOO, \ 
         EMPTY_STRING, 0, 0, EMPTY_STRING,\ 
         EMPTY_FOO, 0} 

아마 단지 문법 설탕. 그것은 분명 구조체는 foobar 둥지 구조체 푸뿐만 아니라 일부 문자열 있음을 만들면서 그것은, 코드 가독성을 AIDS) 생각하지만, "모범 사례"로 간주되는

+1

두 번째'struct '는 불가능합니다. 구조체 자체의 인스턴스를 포함 할 수 없습니다. 다른 'FOO'또는 포인터를 사용 하시겠습니까? –

+0

@ ErnestFriedman-Hill 글쎄. 나는 그 오타를 바로 잡을 것이다. –

+0

코드가 여전히 C가 아니며'[]'이 잘못된 위치에 있습니다. –

답변

4

그냥 "보편적 제로 초기화"를 사용 : 제로로 초기화하는 것은 당신을 위해 정상이면 <type> <identifier> = {0};

int i = {0}; 
double x = {0}; 
char *pname = {0}; 
char name[100] = {0}; 
struct tm moment = {0}; 
struct foo__ one = {0}; 
struct foobar__ two = {0}; 
0

을, 다음 C의 기본 = { 0 }; 초기화 OK입니다.

좀 더 복잡한 것을 원하면 초기화하지 말고 코드를 설정하는 것이 좋습니다.
원하는 것을 설정하고 호출하는 함수를 작성하십시오. 보다 단순하고 읽기 쉽고 신뢰할 수있는 방법으로 초기화 작업을 수행 할 수 있습니다.

매크로를 사용하면 멋지게 만들 수 있습니다. 나에게 나쁜 습관처럼 보일 수도 있습니다.

관련 문제