如何获取结构中的元素总数

时间:2013-04-04 11:28:14

标签: c struct

这是我的代码..

#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机器编译上述代码。我知道下面这行是错误的..

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

但我不确定任何其他技术。首先,是否可以计算结构中元素的总数。请告诉我如何做到这一点。

提前致谢。

4 个答案:

答案 0 :(得分:5)

不可移植,一般或安全,不。

由于编译器可能会为对齐和其他原因添加填充,这会使大小增加,因此无法依赖正确的值。

如果元素的数量很重要,最好使用数组。

顺便说一下,这段代码:

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

错了,不会编译; b不是指针,因此*b不是合法表达式。你的意思是:

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

另外,作为附注,避免在C代码中使用C ++关键字,这可能会有些混乱。

更新我不明白您对“位字段”的引用。它们看起来像这样,只能出现在结构中:

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

同样,它们不可能计算它们,因为它们甚至没有字节大小。但另一方面,你写了定义,包括每个字段的位宽,所以你应该知道有多少,对吧?

答案 1 :(得分:3)

使用sizeof(x) / sizeof(*x)用于数组不用于结构。由于结构的大小不同,所有字段在编译时都是固定的,因此实际上不需要计算元素的数量。

如果您想知道结构中的字段数,则必须自己计算。

答案 2 :(得分:0)

如果您想要结构中元素数量的计数:

struct tag=&p;

如果递增p ++并且每次递增计数并打印计数:

p++;

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

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

我认为这是正确的。

答案 3 :(得分:0)

由于C是静态类型,因此无法在运行时执行此操作。因此,唯一的方法是使用宏。然后,宏可以在编译时生成此数字。我已在another post中展示了如何执行此操作。

基本思想是使用X_MACRO,它允许您定义可以对您的结构成员执行某些操作的特殊X函数