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

时间:2017-04-11 13:10:31

标签: c struct initialization

假设我有一个由多个字段构成的结构,所有字段都是basic data type

例如:

struct myStruct {
    float a;
    float b;
    float c;
    float d;
    float e;
    float f;
}

是否有一种智能方法可以将所有成员初始化或设置为给定值,例如-10xDEADBEEF,是否可以灵活地更改字段数和字段名称?

理由:
将所有字段初始化为无效状态,并确保在以后添加新字段时初始化所有字段。

注意:
如果有一个解决方案只适用于整数类型,我无论如何都感兴趣。

这是来自array initializationzero-initialization of a struct的不同问题,因为我在这里要求将具有所有相同基本数据类型的字段的结构初始化为自定义值。

此问题与结构中的数组无关,也未在Initialize values of array in a struct得到解答。它也没有在structs in C with initial values中处理,因为我在询问所有数据字段具有相同的基本数据类型的情况

3 个答案:

答案 0 :(得分:1)

无法将结构的成员初始化为给定值,而不是零,与结构的字段数无关。

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

getVariable(){
    return this.value;
}

答案 1 :(得分:1)

解决此问题的一种方法是使用X宏概念link1link 2

结构成员列表将是

#define LIST_OF_STRUCT_MEMBERS \
    X(a) \
    X(b) \
    X(c)

然后人们会将结构声明为:

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

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

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

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

由预处理器翻译成:

const struct myStruct myStruct_DEFAULT_VALUE = {-1, -1, -1,};

每次必须初始化新变量时,这可以是copied

可以轻松验证方法,以相同的方式定义打印功能:

#define X(name) printf("%s = %d\n", #name, in->name);
void printAllMembers(struct myStruct* in) {
     LIST_OF_STRUCT_MEMBERS
}    
#undef X

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

已验证here

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

#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

经过测试here

答案 2 :(得分:0)

  

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

不,没有,除非您要初始化字段的值为零/ NULL。在这种情况下,您可以使用初始值设定项,例如{ 0 }

struct myStruct s = { 0 };

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

但是,您可以提供结构特定的初始化程序宏或结构类型的全局const对象,可用于初始化结构。如果你将它与结构声明一起保存,那么它们几乎不会失去同步的风险。此外,您可以通过指定的初始化程序初始化成员,以避免因成员被更改的顺序而产生的问题。例如,

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;

另请注意,这种方法比您要求如何初始化成员(他们不必拥有相同类型或者所有人都获得相同的值)更为一般。