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

__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

アイデアは、最初のダミー列挙型が前のものから 1 ステップ上がるということです。x はマスクで、次のマクロが適切な開始点を持つように、2 番目のダミーが値を復元します。

于 2013-01-30T20:13:45.740 に答える
1

マクロを引数とともに使用しないのはなぜですか?

#define BIT(n) (1 << (n))
于 2013-01-30T14:03:30.483 に答える
0

古典的な解決策は、フィールドの列挙です。

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

次にstd::bitset<count>、H2CO3 が提案したように または BIT マクロを使用します。

BIT(alpha)
于 2013-01-30T14:28:11.187 に答える
0

Microsoft 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 に答える