4

我正在尝试定义一个静态结构并在声明它时初始化它的值,但我不确定我会怎么做。

我在循环中调用一个函数,并且我想在第一次调用该函数时将一个timespec(特别是tv_sec值)初始化为0(某种默认值),但再也不会。

我知道我可以通过以下方式对整数和其他简单数据类型执行此操作: static int foo = 0

但我想对结构做同样的事情,所以它不是那么简单。

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

帮助?

4

3 回答 3

8

聚合对象,如结构或数组,使用初始化程序进行= { ... }初始化。您可以为从第一个开始的结构的连续成员提供初始化程序,或者使用 C99 标记方法

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

请注意,顺便说一句,这种= { ... }方法比乍看起来更普遍。标量对象也可以使用此类初始化器进行初始化

static int foo = { 0 };

另请注意,这= { 0 }会将聚合对象中的所有数据字段清零,而不仅仅是第一个。

最后请记住,具有静态存储持续时间的对象始终自动初始化为零,这意味着如果您只是声明

static struct timespec ts;

您已经保证以零初始化对象结束。无需明确地这样做。

于 2013-06-26T18:20:22.637 回答
1

静态对象,无论是结构、联合、数组还是基本类型,在没有显式初始化程序的情况下始终初始化为零。只需使用

static struct timespec foo;
于 2013-06-26T18:21:09.897 回答
0

您可以简单地使用另一个变量,而不是使用“无效”值进行初始化:

static struct timespec ts;
static int ts_initialized = 0;

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

优点:
1. 更清晰一些。
2. 无需寻找永远不会使用的“魔法”值。

于 2013-06-26T19:19:10.723 回答