Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动生成位位置_C++ - Fatal编程技术网

C++ 自动生成位位置

C++ 自动生成位位置,c++,C++,我有一些像这样的位掩码: 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 { co

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

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; 
}
名称空间位{

常量无符号位_one=1u为什么不使用带参数的宏

#define BIT(n) (1 << (n))

#定义位(n)(1经典解决方案是枚举字段:

enum foo_flags {
    alpha,
    beta,
    gamma,
    count
};
然后使用
std::bitset
或H2CO3建议的位宏:

BIT(alpha)

微软C++具有

__COUNTER__
预定义的宏,因此您可以

#define NEXTBIT (1u << __COUNTER__)
namespace bits { 
  const unsigned bit_one    = NEXTBIT; 
  const unsigned bit_two    = NEXTBIT; 
  const unsigned bit_three  = NEXTBIT; 
}

<代码> >定义NExtBIT(1U

),可以使用< C++ >代码>宏>,这是标准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;
}
#包括
名称空间位
{
常量无符号基=_行_;+1;

const unsigned BitOne=1u以下选项可以实现此目的:

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

想法是第一个虚拟枚举比前一个增加一步。x是掩码,第二个虚拟还原值,这样下一个宏就有了一个好的起点。

您没有真正展示任何合理的用例。这个示例是无用的。@BartekBanachewicz,例程循环大量数据并分配各种标志“定义位(n)1u@LastCoder我想要后者。基本上,我在寻找一组唯一的常量位掩码,排序并不重要(只要编译后它是常量)。或
位(x,n)(x抱歉,问题不完全清楚。我希望每次使用
BIT
时,不必手动键入
n
。枚举的位号将自动递增1(例如,编号为0..32的位)用宏把枚举的比特数转换成你想要的掩码。WoooO!给你的程序添加一行注释实际上会破坏它!这看起来很难对付,似乎违背了我所有的C++本能,但是评论并不会像@ Lyyddor建议的那样破坏程序,只要使用了所有的东西。奇怪的是,到目前为止,这是最接近解决方案的。
1
2
4
8