首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动生成位位置

自动生成位位置
EN

Stack Overflow用户
提问于 2013-01-30 21:57:24
回答 5查看 142关注 0票数 2

我有一些位掩码,看起来像这样:

代码语言:javascript
复制
namespace bits { 
  const unsigned bit_one    = 1u << 0; 
  const unsigned bit_two    = 1u << 1; 
  const unsigned bit_three  = 1u << 2; 
  ......
  const unsigned bit_ten    = 1u << 10; 
}

除了有更多的位和名称实际上是我的程序有意义的标志。但有时我会删除比特,添加比特,重新组合相似的比特,等等。理想情况下,我可以这样做:

代码语言:javascript
复制
namespace bits { 
  const unsigned bit_one    = 1u << COUNTER; 
  const unsigned bit_two    = 1u << COUNTER; 
  const unsigned bit_three  = 1u << COUNTER; 
  ......
  const unsigned bit_ten    = 1u << COUNTER; 
}

是否有一些模板/宏可以自动执行此过程?我知道__COUNTER__,但这是一个头文件,所以如果它也包含在其他使用__COUNTER__的源码中,它可能会崩溃。我在一个C++11之前的框架中工作,所以虽然最终会升级我的编译器,但不使用C++11的解决方案将是理想的。

EN

回答 5

Stack Overflow用户

发布于 2013-01-30 22:03:30

为什么不使用带参数的宏呢?

代码语言:javascript
复制
#define BIT(n) (1 << (n))
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 00:13:15

可以使用标准C和C++中的__LINE__宏。请谨慎使用,并记录您的意图,以便其他阅读代码的人能够理解。

代码语言:javascript
复制
#include <iostream>


namespace Bits
{
    const unsigned Base     = __LINE__ + 1;
    const unsigned BitOne   = 1u << __LINE__-Base;
    const unsigned BitTwo   = 1u << __LINE__-Base;
    const unsigned BitThree = 1u << __LINE__-Base;
}


int main(void)
{
    std::cout << Bits::BitOne   << '\n';
    std::cout << Bits::BitTwo   << '\n';
    std::cout << Bits::BitThree << '\n';
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 04:13:46

下面的代码可以解决这个问题:

代码语言:javascript
复制
#define NEXT_MASK(x)         \
    DUMMY1_##x,              \
    x = (1U << DUMMY1_##x), \
    DUMMY2_##x = DUMMY1_##x

enum {
  NEXT_MASK(one),
  NEXT_MASK(two),
  NEXT_MASK(three),
  NEXT_MASK(four)
};

#include <stdio.h>

int main()
{
  printf("%x\n", one);
  printf("%x\n", two);
  printf("%x\n", three);
  printf("%x\n", four);
  return 0;
}

程序将发出:

代码语言:javascript
复制
1
2
4
8

这个想法是第一个虚拟枚举比之前的一个前进一步。X是掩码,第二个虚拟对象恢复该值,因此下一个宏将有一个很好的起点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14605763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档