2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

列挙型を利用してフラグの定義をする(C++)

Posted at

フラグに名前をつけて定義したらたまに間違う問題

この対応のための方法をいくつか考えていまして。
C++14から2進数での記述に対応したこともあって以下のような手法を最近使っています。

static const unsigned char FLAGID_HAGE = 0b1;
static const unsigned char FLAGID_HIGE = 0b10;
static const unsigned char FLAGID_HUGE = 0b100;
static const unsigned char FLAGID_HEGE = 0b1000;
static const unsigned char FLAGID_HOGE = 0b10000;

=の位置を揃えておけば斜面の滑らかさで変なところに気づけるという具合。
このやり方では間に何か挟もうとするとそれ以降の数値を全部書き換えないといけません。
というわけで次の方法を考えました。

#define	Flag(x)	flag_##x = 1 << x
enum
{
	Hage = 0,
	Hige,
	Huge,
	Hege,
	Hoge
};
static const unsigned char Flag( Hage );
static const unsigned char Flag( Hige );
static const unsigned char Flag( Huge );
static const unsigned char Flag( Hege );
static const unsigned char Flag( Hoge );

マクロでユニークなビット定数のフラグを生成できます。
これだと定義を追うのが大変という問題が残ります...それに2回ずつHageなきゃいけない...
static const unsigned char をマクロに含めてやるとスッキリしそうですな。

#define	CreateFlag(x)	static const unsigned char flag_##x = 1 << x
enum
{
	Hage = 0,
	Hige,
	Huge,
	Hege,
	Hoge
};
CreateFlag( Hage );
CreateFlag( Hige );
CreateFlag( Huge );
CreateFlag( Hege );
CreateFlag( Hoge );

なんとか1回で済ませる術はないものか。

2
1
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?