2013-10-16 3 views
0

기본 초기화 값으로 구조를 선언하는 방법이 있습니까?정의에서 구조체를 초기화하는 방법은 무엇입니까?

나는이 같은 structur를 정의하는 헤더 파일이 있습니다

typedef struct struc_s 
{ 
    size_t cost const = 2000; 
    size_t dmg const = 100; 
    size_t def const = 100; 
    size_t hull const = 1500; 
    size_t shield const = 300; 
    size_t capacity const = 2; 
    size_t destruc const = 10; 
} struc_t; 

을하지만이 당연히 작동하지 않습니다.

또한이 헤더 파일에 struc_t 유형의 var을 선언하는 방법으로도 문제가 없습니다. 그러나 나는 옳은 것을 기억한다. 나는 내가하고 싶은 것은이 헤더가 포함되어 어디 var = struc_s.dmg 등을 할 수 있기를 원하는 곳마다이고 결과는 그 var에 값 100을 보유하고 있어야한다 extern

로 C 파일을 decalre해야합니다. 하지만 헤더의 다른 곳에서는 struc_s를 선언하고 싶지 않습니다. 이 동작을 보관할 수있는 방법이 있습니까?

답변

1

원하지 않는 방식으로.

typedef를 할 때 메모리 영역의 모양을 정의하고 있습니다.이 영역은 할당 및 채우기와 다릅니다.

가능한 대안 :

typedef struct 
{ 
    size_t cost; 
    size_t dmg; 
    size_t def; 
    size_t hull; 
    size_t shield; 
    size_t capacity; 
    size_t destruc; 
} struc_t; 


#ifndef DEFAULT_STRUC_VALUES_DEFINED 
#define DEFAULT_STRUC_VALUES_DEFINED 

const struc_t DEFAULT_STRUC = { 
    .cost = 2000, 
    .dmg = 100, 
    .def = 100, 
    .hull = 1500, 
    .shield = 300, 
    .capacity = 2, 
    .destruc = 10 
}; 
#endif 

하고 새로 생성 할 때 다음하십시오 (!) 참고로

struc_t *new_struc = malloc(sizeof(struc_t)); 
memcpy(new_struc, DEFAULT_STRUC, sizeof(struc_t)); 

를, 당신의 구조체 멤버에 대한 당신이 size_t를 사용하는 이유가 ? 본질적으로 잘못된 것은 없지만 플랫폼마다 다를 수 있습니다.

+0

은 기본 구조체가 될 수 있습니다. 여기에는 'extern const struc_t DEFAULT_STRUC'와 같은 doint가 포함되지 않은 evrywhere가 있습니다. 그게 나에게 좋을 것, 난 단지 선언하지 않고 thoose 값을 포함하는 구조체를 + 명시 적으로 초기화하고 싶습니다. – dhein

+0

그리고 size_t를 사용하는 것은 CPU의 크기를 알기에 충분하기 때문입니다. 그러니 ... 나는 size_t처럼 jsut 진짜 좋은 이유가 없어. – dhein

+0

'# ifndef'를 사용하여 답변을 업데이트하면 원하는대로 처리 할 수 ​​있습니다. 즉, .c 파일에'DEFAULT_STRUC'를 넣고 헤더에'extern const struc_t DEFAULT_STRUC'를 쓰는 것은 잘못된 것이 아닙니다. –

1
typedef struct struc_s 
{ 
int a; 
int b;  
}s; 

이것은 형식 정의이며 개체 선언이 아닙니다. 개체를 선언 할 때 초기화 할 수 있습니다.

연속적인 멤버를 지정할 수있는 경우 C89 스타일 초기화 프로그램이 사용됩니다.

비 연속 또는 순서 멤버리스트로부터, 지정된 초기화 스타일이 세 번째 방법은 동일한 유형의 기존의 객체의 값을 복사 할

s obj={.a=1,.b=2}; 

    or 

s obj={.b=2,.a=1}; 

사용될 수 들어

s obj={1,2}; 

s obj1=obj; 
관련 문제