2

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

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

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

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 的解决方案将是理想的。

4

5 回答 5

1

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

#define BIT(n) (1 << (n))
于 2013-01-30T14:03:30.483 回答
1

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

#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;
}
于 2013-01-30T16:13:15.267 回答
1

以下将解决问题:

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

该程序将发出:

1
2
4
8

这个想法是第一个虚拟枚举比之前的枚举更上一层楼。x 是掩码,第二个 dummy 恢复值,这样下一个宏会有一个好的起点。

于 2013-01-30T20:13:45.740 回答
0

经典的解决方案是枚举字段:

enum foo_flags {
    alpha,
    beta,
    gamma,
    count
};

然后使用std::bitset<count>H2CO3 建议的任何一个或 BIT 宏:

BIT(alpha)
于 2013-01-30T14:28:11.187 回答
0

微软 C++ 有

__COUNTER__

预定义的宏,所以你可以...

#define NEXTBIT (1u << __COUNTER__)
namespace bits { 
  const unsigned bit_one    = NEXTBIT; 
  const unsigned bit_two    = NEXTBIT; 
  const unsigned bit_three  = NEXTBIT; 
}
于 2013-01-30T14:49:55.083 回答