如何获得结构中任何成员的位位置

时间:2017-04-25 22:51:25

标签: c arm

如何获得结构中任何成员的位位置?

在示例>

typedef struct BitExamStruct_
{
    unsigned int v1: 3;
    unsigned int v2: 4;
    unsigned int v3: 5;
    unsigned int v4: 6;
} BitExamStruct;

是否有任何宏可以获取GetBitPos(v2,BitExamStruct)等任何成员的位位置?

我认为编译器可能知道成员'基于结构中的位长度的位置。所以我想知道我是否可以通过使用一个简单的宏而不运行代码来获得它。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

我知道没有标准方法这样做,但这并不意味着您无法找到解决方案。

以下不是最漂亮的代码;它是一种识别变量"开始位置的黑客攻击。在记忆中。请记住,根据字节顺序,以下内容可能会产生不同的结果:

#include <stdio.h>
#include <string.h>

typedef struct s_toto
{
  int a:2;
  int b:3;
  int c:3;    
} t_toto;

int
main()
{
  t_toto toto;
  unsigned char *c;
  int bytes;
  int bits;

  memset(&toto, 0, sizeof(t_toto));
  toto.c = 1;
  c = (unsigned char *)&toto;
  for (bytes = 0; bytes < (int)sizeof(t_toto); bytes++)
    {
      if (*c)
        break;
    }
  for (bits = 0; bits < 8; bits++)
    {
      if (*c & 0b10000000)
        break;
      *c = (*c << 1);
    }
  printf("position (bytes=%d, bits=%d): %d\n", bytes, bits, (bytes * 8) + bits);
  return 0;
}

我所做的是将整个结构初始化为0,并将1设置为我想要定位的变量的值。结果是结构中只有一位设置为1。然后我读取每个字节的存储器字节,直到找到一个不为零的存储器字节。一旦找到,我可以看看它的位,直到我找到了它的位置。

答案 1 :(得分:1)

没有便携式(又称标准C)方式。但是在盒子外面思考,如果你需要完全控制或者需要这些信息,那么bitfields就是错误的方法。正确的解决方案是转移和屏蔽。当然,只有当您控制源代码时,这才是可行的。