我有一些位掩码,看起来像这样:
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的解决方案将是理想的。
发布于 2013-01-30 22:03:30
为什么不使用带参数的宏呢?
#define BIT(n) (1 << (n))发布于 2013-01-31 00:13:15
可以使用标准C和C++中的__LINE__宏。请谨慎使用,并记录您的意图,以便其他阅读代码的人能够理解。
#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-31 04:13:46
下面的代码可以解决这个问题:
#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是掩码,第二个虚拟对象恢复该值,因此下一个宏将有一个很好的起点。
https://stackoverflow.com/questions/14605763
复制相似问题