【问题标题】:Static Declaration of a structure结构的静态声明
【发布时间】:2013-06-26 18:17:19
【问题描述】:

我正在尝试定义一个静态结构并在声明它时对其值进行一次初始化,但我不太确定该怎么做。

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

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

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

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

帮助?

【问题讨论】:

  • 可以使用{...} 初始化结构体,是这个意思吗?
  • @Matt 可能有用...
  • @Matt 是的,确实如此,谢谢,把它放在答案中,我会给你信用
  • 好消息是:如果你想零初始化一个静态对象,你不需要做任何事情。默认情况下它是零初始化的。

标签: c static initialization


【解决方案1】:

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

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

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

static int foo = { 0 };

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

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

static struct timespec ts;

您已经保证最终得到零初始化的对象。不需要明确地这样做。

【讨论】:

    【解决方案2】:

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

    static struct timespec foo;
    

    【讨论】:

      【解决方案3】:

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

      static struct timespec ts;
      static int ts_initialized = 0;
      
      if (!ts_initialized) {
          init_ts(&ts);
          ts_initialized = 1;
      }
      

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

      【讨论】:

        猜你喜欢
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多