如何检查大结构中的所有字段由编译器初始化

时间:2013-01-09 02:41:39

标签: c++ c

我经常使用包含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;
    }
}

2 个答案:

答案 0 :(得分:5)

从语言的角度来看,可能不是很多。

但是,GCC对于这种情况有-Wmissing-field-initializers标志。我相信其他编译器会提供类似的东西。

答案 1 :(得分:3)

如果你在谈论C ++,你可以在类中编写一个构造函数,用你想要的任何东西进行初始化。但是当然会使用{..}取消POD您的数据并阻止结构初始化。

如果它是C,你可以编写一个工厂方法,它返回一个初始化的结构,如@Pubby建议的那样。

如果计算变量的数量是困扰你的,你可以使用C struct initialization using labels. It works, but how? Documentation?中的命名初始化