2013-06-26 206 views
4

我試圖定義一個靜態結構並初始化它的值,當它被聲明時,但我真的不知道我會如何做。靜態聲明的結構

我打電話在一個循環的功能,我想初始化timespec(特別是tv_sec值)0(排序默認值)在第一次函數被調用,但從來沒有一次。

我知道我可以做與整數和其它簡單數據類型做到這一點: static int foo = 0

但我想這樣做與結構,所以它不是那麼簡單。

本質上,我想這樣做:static struct timespec ts.tv_sec = 0;但是,那是非法的,所以我需要知道法律形式(如果存在)。

幫助?

+0

可以使用'{...}'來初始化結構體,那是什麼意思? – Matt

+0

@Matt可能會工作... – Nealon

+0

@Matt是的,這樣做,謝謝,把它放在一個答案,我會給你信用 – Nealon

回答

7

集合對象,比如結構體或者數組,被初始化爲= { ... }。您可以開始爲結構的連續成員初始化供應與第一,或使用C99標記的方法

static struct timespec ts = { .tv_sec = 0 }; 

注意BTW是= { ... }方法更爲普遍比它可能會開始看起來。標對象也可以用這樣的初始化

static int foo = { 0 }; 

還要注意的是= { 0 }將歸零所有的數據字段的聚合對象,不只是第一個初始化。

最後請記住,具有靜態存儲期的對象總是會被自動初始化爲零,也就是說如果你只需要聲明

static struct timespec ts; 
您已經保證零初始化對象落得

。不需要明確地做。

1

一個靜態對象,不管它是結構體,聯合體,數組還是基本類型總是在沒有顯式初始化的情況下初始化爲零。只需使用

static struct timespec foo; 
0

而是與 「無效」 值初始化的,你可以簡單地使用另一個變量:

static struct timespec ts; 
static int ts_initialized = 0; 

if (!ts_initialized) { 
    init_ts(&ts); 
    ts_initialized = 1; 
} 

優點:
1.有些更加清晰。
2.無需找到「魔術」值,永遠不會使用它。