这是我的代码..
#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);
但我不确定任何其他技术。首先,是否可以计算结构中元素的总数。请告诉我如何做到这一点。
提前致谢。
答案 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函数