2013-04-04 76 views
0

這裏是我的代碼..如何獲得元素的總數在結構

#include <stdio.h> 

struct new { 
    unsigned short b0 = 0; 
    unsigned short b1 = 0; 
    unsigned short b2 = 0; 
    unsigned short b3 = 0; 
    unsigned short b4 = 0; 
    unsigned short b5 = 0; 
    unsigned short b6 = 0; 
    unsigned short b7 = 0; 
}; 

int main() 
{ 
    printf("Bit Field Example\n"); 
    struct new b; //Seems wrong to me 
    int result = sizeof(b)/sizeof(*b); //Seems wrong to me 
    printf("Size: %d\n", result); 
    return 0; 
} 

我使用的是Linux機器來編譯代碼提及。我知道下面的行是錯誤的。但我不確定任何其他技術。我不知道下面的行是錯誤的。但我不確定任何其他技術。我不知道下面的行是錯誤的。但我不知道任何其他技術。我不知道下面的行是錯誤的。但我不知道任何其他技術。但我不知道下面的行是錯誤的。但我不知道任何其他技術。首先,是否可以統計結構中的元素總數?請給我一些關於如何去做的想法。

在此先感謝。

回答

4

不可攜帶,一般或安全,沒有。

由於編譯器可能會添加用於對齊和其他原因的填充,這將導致大小增大,所以不可能依賴該值是正確的。

如果元素的數量很重要,最好使用一個數組。

順便提一下,此代碼:

int result = sizeof(b)/sizeof(*b); 

是錯誤的,將無法編譯; b不是指針,因此*b不是合法表達式。您的意思是:

const int result = sizeof b/sizeof b.b0; 

此外,作爲一個側面說明,避免在C代碼中使用C++的關鍵字,它會帶來一些混淆。

UPDATE我不明白你對「位域」的引用。他們這個樣子,只能發生在結構:

struct strawberry { 
    unsigned short fields : 10; 
    unsigned short forever : 6; 
}; 

再次,它不可能指望他們,因爲他們甚至沒有字節大小。但另一方面,你寫了包括每個字段的位寬的定義,所以你應該知道有多少,對吧?

+0

所以要根據你的,它不可能指望在結構元素的個數..對 ?那麼,是否可以使用數組定義位域?我的意思是,這將是正確的語法或其他... – 2013-04-04 11:31:09

+0

嗯... Thnx的明確的例子..我發現我的錯誤... Thnx很多..但在這裏,還有一個問題出現,無論是否這些位字段可以類似於結構的元素訪問。 – 2013-04-04 11:38:45

3

使用sizeof(x)/sizeof(*x)用於陣列不適用於結構。由於結構不是可變大小,所有字段在編譯時都是固定的,所以實際上不需要計算元素的數量。

如果你想知道結構中有多少個字段,你必須自己計算它們。

0

如果你想在一個結構元素的數量的計數:

struct tag=&p; 

如果增加在p ++,每次增加計數並打印計數:

p++; 

if(i=o;i<arr[i];i++) 

count++; 
printf("%d",count); 

我認爲這是正確的。

0

由於C是靜態類型的,因此在運行時不可能這樣做。因此唯一的方法是使用宏。宏可以在編譯時生成這個數字。我已經展示瞭如何在another post中做到這一點。

的基本思想是用X_MACRO的,讓你可以定義特殊的X功能,可以做一些與你的結構成員