1

这是我的代码..

#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

4 回答 4

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;
};

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

于 2013-04-04T11:29:23.553 回答
3

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

如果你想知道一个结构中有多少个字段,你必须自己数一数。

于 2013-04-04T11:32:40.823 回答
1

由于 C 是静态类型的,因此无法在运行时执行此操作。因此,唯一的方法是使用宏。然后宏可以在编译时生成这个数字。我已经在另一篇文章中展示了如何做到这一点。

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

于 2016-07-18T03:05:17.377 回答
-1

如果要计算结构中元素的数量是:

struct tag=&p;

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

p++;

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

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

我认为这是正确的。

于 2013-12-05T06:35:31.213 回答