我经常使用包含20个以上字段的大结构,需要用不同的值进行初始化。 每次我写init函数时,我都是忧郁症,我总是担心我错过了一个被分配值的字段。所以我必须逐个检查每个字段。
我讨厌这个,所以我使用CHECK_VAL宏,就像示例代码一样。 现在,如果我在结构初始化中遗漏了一个项目,编译器将报告错误:
“Check”类型的值不能用于初始化类型的实体 “INT”
我的问题:是否有其他方法可以帮助解决我的问题?语言是C和C ++,大结构是POD类型。
代码示例
#define DOCHECK 1
#if DOCHECK
typedef struct _Check{
char k;
} Check;
Check g_check = {'c'};
#define CHECK_DEL Check c1234567;
#define CHECK_VAL (g_check)
#else
#define CHECK_DEL
#define CHECK_VAL
#endif
typedef struct _BigStruct{
int bar;
int foo;
/*...*/
int f99;
int f100;
CHECK_DEL;
}BigStruct;
void initBigStruct(BigStruct* p){
int a,b,c,d;
a = b = c = d = 0;
/*
many other code to caculate the value of a,b,c,d
*/
{
BigStruct tmp = {a,b,c,d, CHECK_VAL};
*p = tmp;
}
}
答案 0 :(得分:5)
从语言的角度来看,可能不是很多。
但是,GCC对于这种情况有-Wmissing-field-initializers
标志。我相信其他编译器会提供类似的东西。
答案 1 :(得分:3)
如果你在谈论C ++,你可以在类中编写一个构造函数,用你想要的任何东西进行初始化。但是当然会使用{..}
取消POD您的数据并阻止结构初始化。
如果它是C,你可以编写一个工厂方法,它返回一个初始化的结构,如@Pubby建议的那样。
如果计算变量的数量是困扰你的,你可以使用C struct initialization using labels. It works, but how? Documentation?中的命名初始化