2013-06-26 157 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.无需找到“魔术”值,永远不会使用它。