2013-01-09 33 views
2

經常我使用大於20的字段需要用不同的值初始化的字段。 每次我寫init函數的時候,我都是憂鬱症,我總是擔心我錯過了一個被賦予價值的領域。所以我必須逐個檢查每個字段。如何檢查大結構中的所有字段是由編譯器初始化的

我討厭這個,所以我使用CHECK_VAL宏,如示例代碼。 現在,如果我在struct初始化錯過了一個項目時,編譯器會報告錯誤:

a value of type "Check" cannot be used to initialize an entity of type "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; 
    } 
} 

回答

5

從一個語言點,大概也不是很多。

但是,GCC的-Wmissing-field-initializers標誌正是這種情況。我相信其他編譯器提供了類似的東西。

+0

感謝,這就是我想要的。 PS,看起來你的答案中的鏈接是錯誤的,你能幫助解決它嗎? – RolandXu

2

如果你在談論C++,你可以寫一個構造函數給類,用你想要的任何東西進行初始化。但是,當然這會取消您的數據並阻止{..}的結構初始化。

如果是C,你可以編寫一個工廠方法,它返回一個初始化結構,如@Pubby所示。

如果計數變量的數量是是什麼在困擾你,你可以使用一個名爲初始化爲C struct initialization using labels. It works, but how? Documentation?

+2

在C中,你可以編寫一個返回結構的函數。 – Pubby

+0

構造函數沒有幫助,因爲我必須檢查構造函數中的所有賦值。 – RolandXu