首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将结构的所有成员(相同、基本、数据类型)初始化为一个给定值

将结构的所有成员(相同、基本、数据类型)初始化为一个给定值
EN

Stack Overflow用户
提问于 2017-04-11 13:10:31
回答 3查看 1.6K关注 0票数 2

假设我有一个由几个字段组成的结构,所有这些都是相同的基本数据类型

例如:

代码语言:javascript
复制
struct myStruct {
    float a;
    float b;
    float c;
    float d;
    float e;
    float f;
}

是否有一种聪明的方法可以根据字段数和字段名的变化灵活地初始化所有成员或将所有成员设置为给定的值,例如-10xDEADBEEF

理由:

将所有字段初始化为无效状态,如果稍后添加新字段,则确保所有字段都已初始化。

注意:

如果有一个只适用于整数类型的解决方案,我还是会感兴趣的。

这是一个与数组初始化结构的零初始化不同的问题,因为这里我问的是如何将一个结构初始化为一个自定义值,其中的字段都是相同的基本数据类型。

这个问题与结构中的数组无关,也没有在初始化结构中数组的值上得到回答。它在C中带有初始值的结构中也不被处理,因为我询问的是所有数据字段都具有相同的基本数据类型的情况

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-11 17:02:50

解决这个问题的一种方法是使用X宏概念link1链接2

结构成员的列表将是

代码语言:javascript
复制
#define LIST_OF_STRUCT_MEMBERS \
    X(a) \
    X(b) \
    X(c)

然后,将该结构声明为:

代码语言:javascript
复制
#define X(name) int name;
struct myStruct {
     LIST_OF_STRUCT_MEMBERS
}
#undef X

可以用任何基本数据类型替换int

然后可以创建一个初始化为默认值的const变量。

代码语言:javascript
复制
#define X(name) -1,
const struct myStruct myStruct_DEFAULT_VALUE = { LIST_OF_STRUCT_MEMBERS };
#undef X

由预处理器翻译成:

代码语言:javascript
复制
const struct myStruct myStruct_DEFAULT_VALUE = {-1, -1, -1,};

每次必须初始化新变量时,这都可以是已复制

可以很容易地验证该方法定义打印函数的方式相同:

代码语言:javascript
复制
#define X(name) printf("%s = %d\n", #name, in->name);
void printAllMembers(struct myStruct* in) {
     LIST_OF_STRUCT_MEMBERS
}    
#undef X

(当基础基本数据类型发生更改时,printAllMembers函数可能需要进行一些修改)。

验证了这里

如果我们在LIST_OF_STRUCT_MEMBERS中包含数据类型,这个概念可以推广到具有不同数据类型的字段的结构中,例如:

代码语言:javascript
复制
#define LIST_OF_STRUCT_MEMBERS \
    X(int, a) \
    X(float, b) \
    X(double, c)

#define X(type, name) type name;
struct myStruct {
     LIST_OF_STRUCT_MEMBERS
};
#undef X

#define X(type, name) -1,
const struct myStruct myStruct_DEFAULT_VALUE = { LIST_OF_STRUCT_MEMBERS };
#undef X

#define intFormatting "%d"
#define floatFormatting "%f"
#define doubleFormatting "%f"

#define X(type, name) printf(#name " = " type ## Formatting "\n", in->name);
void printMyStruct (struct myStruct* in) {
     LIST_OF_STRUCT_MEMBERS
}
#undef X

测试这里

票数 2
EN

Stack Overflow用户

发布于 2017-04-11 13:22:40

不依赖于结构的字段数,无法将结构的成员初始化为给定的值(除零外)。

但是,您可以开发一个模块,将结构的新实例提供给用户代码。模块现在可以将成员初始化为您想要的任何值,而对结构的任何更改,在这方面,仅限于模块。例如:

代码语言:javascript
复制
// mystruct.h
struct MYSTRUCT {
    ...
} t_mystruct;
t_mystruct *newMyStruct(void);

// any module.c
#include "mystruct.h"

t_mystruct *newMyStruct(void)
{
    t_mystruct *newstruct;
    if ((newstruct= malloc(sizeof(t_mystruct)))==0) return 0;
    newstruct->member1= -1;
    newstruct->...
    return newstruct;
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-11 13:25:57

是否有一种聪明的方法可以独立于字段数和字段名来初始化所有成员或将所有成员设置为给定值,例如-1或0xDEADBEEF?

不,不存在,除非要初始化字段的值为零/空。在这种情况下,可以使用初始化器(如{ 0 } )。

代码语言:javascript
复制
struct myStruct s = { 0 };

这意味着要将第一个字段初始化为0;因为C不允许聚合的部分初始化,其他字段获得的值与默认情况下的值相同,如果它们具有静态持续时间,也就是0 / NULL (对于标量;默认初始化递归地应用于本身是聚合的成员)。

但是,您可以提供一个特定于结构的初始化器宏,或者可以用于初始化结构的结构类型的全局const对象。如果您将其与结构声明一起维护,那么它们不同步的风险就很小。此外,您还可以通过指定的初始化器初始化成员,以避免成员被更改的顺序引起的问题。例如,

代码语言:javascript
复制
struct myStruct {
    float a;
    float b;
    float c;
};

#define MYSTRUCT_INITIALIZER { .a = 1.0, .b = 1.0, .c = 1.0 }

// ...

struct mystruct s = MYSTRUCT_INITIALIZER;

请注意,在如何初始化成员方面,这种方法比您要求的更普遍(它们不一定都具有相同的类型,或者所有成员都接收相同的值)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43346927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档