首页 > 解决方案 > c: 宏初始化新的 typedef'd 对象

问题描述

我定义了一个新类型:

#define MAX_ELEM 10
typedef struct my_type {
   int v[MAX_ELEM];
} my_type;

所以现在,当我声明一个这种类型的新对象时,我想将它初始化为默认值:

my_type m = MY_TYPE_INIT();

我可以有这样的东西:

#define MY_TYPE_INIT(m) \
   do { \
      int i;
      for (i = 0; i < MAX_ELEM; i++)  \
          m->v[i] = -1;
   } while (0)

但我想通过将值直接分配给 type 的对象来初始化我之前展示的方式my_type。有可能这样做吗?谢谢。

标签: cmacrostypedef

解决方案


我可以有这样的东西:

#define MY_TYPE_INIT(m) \
   do { \
      int i;
      for (i = 0; i < MAX_ELEM; i++)  \
          m->v[i] = -1;
   } while (0)

不,你不能。将其打包在宏中不允许您将dofor语句或可执行块放入初始化程序中。

可以定义宏作为初始化程序。它们甚至可以是类似函数的。但是它们必须扩展为您使用它们的类型的有效初始值设定项。

宏不容易进行计数或迭代,尤其是在没有上限的情况下。您最干净的方法是写出初始化程序,并在MAX_ELEM发生更改时对其进行更新:

#define MY_TYPE_INIT { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }

// ...

my_type mt = MY_TYPE_INIT;

或者写一个初始化函数:

void init_my_type(my_type *mt) {
    for (int i = 0; i < MAX_ELEM; i++) {
        m->v[i] = -1;
    }
}

// ...

my_type mt;

// Note: must be inside a function:
init_my_type(&mt);

推荐阅读