2013-10-16 101 views
0

有沒有辦法用默認的initalisation值聲明結構?如何初始化定義的結構?

我有一個頭文件,它定義了這樣的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; 

但這ofcourse不起作用。

我也可以在這個頭文件中聲明一個類型爲struc_t的var的方法。但是,我記得沒錯。我將不得不decalre它在c文件extern

每一個地方,其中包括這頭我希望能夠做var = struc_s.dmg和我想要做的是,其結果應該是VAR持有價值100。 但我不想在頭部聲明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

會默認結構是可以接受的forom evrywhere,其中包含沒有doint像'extern const struc_t DEFAULT_STRUC'嗎?比這對我來說很好,我只想要一個包含thoose值的結構,而不用聲明+初始化它的顯式。 – dhein

+0

我喜歡用size_t,因爲它就我所知的cpu操作寬度的大小而言。所以...我只是喜歡size_t我沒有一個真正的好理由。 – dhein

+0

用'#ifndef'更新了答案,它可以確保你做到了。 也就是說,將'DEFAULT_STRUC'放在.c文件中並在頭文件中執行'extern const struc_t DEFAULT_STRUC'沒什麼問題。 –

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

這是類型定義而不是對象的聲明。您可以在聲明對象時進行初始化。

當連續的成員可能被給出時,使用C89風格的初始化器。

s obj={1,2}; 

對於非連續的或無序成員列表的,指定初始化樣式可以使用

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

    or 

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

的第三種方法是複製同一類型的現有對象的值

s obj1=obj;