假设我有一个由几个字段组成的结构,所有这些都是相同的基本数据类型。
例如:
struct myStruct {
float a;
float b;
float c;
float d;
float e;
float f;
}是否有一种聪明的方法可以根据字段数和字段名的变化灵活地初始化所有成员或将所有成员设置为给定的值,例如-1或0xDEADBEEF?
理由:
将所有字段初始化为无效状态,如果稍后添加新字段,则确保所有字段都已初始化。
注意:
如果有一个只适用于整数类型的解决方案,我还是会感兴趣的。
这是一个与数组初始化和结构的零初始化不同的问题,因为这里我问的是如何将一个结构初始化为一个自定义值,其中的字段都是相同的基本数据类型。
这个问题与结构中的数组无关,也没有在初始化结构中数组的值上得到回答。它在C中带有初始值的结构中也不被处理,因为我询问的是所有数据字段都具有相同的基本数据类型的情况
发布于 2017-04-11 17:02:50
结构成员的列表将是
#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,};每次必须初始化新变量时,这都可以是已复制。
可以很容易地验证该方法定义打印函数的方式相同:
#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中包含数据类型,这个概念可以推广到具有不同数据类型的字段的结构中,例如:
#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测试这里。
发布于 2017-04-11 13:22:40
不依赖于结构的字段数,无法将结构的成员初始化为给定的值(除零外)。
但是,您可以开发一个模块,将结构的新实例提供给用户代码。模块现在可以将成员初始化为您想要的任何值,而对结构的任何更改,在这方面,仅限于模块。例如:
// 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;
}发布于 2017-04-11 13:25:57
是否有一种聪明的方法可以独立于字段数和字段名来初始化所有成员或将所有成员设置为给定值,例如-1或0xDEADBEEF?
不,不存在,除非要初始化字段的值为零/空。在这种情况下,可以使用初始化器(如{ 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;请注意,在如何初始化成员方面,这种方法比您要求的更普遍(它们不一定都具有相同的类型,或者所有成员都接收相同的值)。
https://stackoverflow.com/questions/43346927
复制相似问题