c - 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
。有可能这样做吗?谢谢。
解决方案
我可以有这样的东西:
#define MY_TYPE_INIT(m) \ do { \ int i; for (i = 0; i < MAX_ELEM; i++) \ m->v[i] = -1; } while (0)
不,你不能。将其打包在宏中不允许您将do
或for
语句或可执行块放入初始化程序中。
您可以定义宏作为初始化程序。它们甚至可以是类似函数的。但是它们必须扩展为您使用它们的类型的有效初始值设定项。
宏不容易进行计数或迭代,尤其是在没有上限的情况下。您最干净的方法是写出初始化程序,并在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);
推荐阅读
- python - 映射使用 python 生成的图形中的最低点
- bash - 从字符串中排除某个字符之后的所有内容
- python - 创建数据框列表
- spring-boot - 在执行 postam org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value
- php - 使用 intelephense 时出现实际上不是 vscode 错误的错误
- kotlin - ktor 测试失败,“响应已发送”
- python-3.x - 循环“为”剂量开始
- python - 在 VSCode 中,如何在 python 文件上应用单引号,而不仅仅是打字稿,更漂亮?
- c# - HotChocolate 没有正确映射模型以输入
- python - 如果句子中有重复的单词如何删除行