• ベストアンサー

| (or) を使った関数の引数の作り方

たとえば、 MessageBoxの4つ目の引数のような感じで、 MessageBox(NULL, "本文","タイトル", MB_YESNO|MB_ICONQUESTION); の、 4つ目の引数が|(or)で引数の指定ができますが、 こういった関数を自分で作る場合に、 どのように関数作成して、 4つ目の引数は関数内でどのように取得していけばいいのでしょうか? 基本的なことなのかとは思うのですが・・・ 良い解説のあるHPなど、 ご教授いただきたく思います。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hiro_wide
  • ベストアンサー率43% (7/16)
回答No.1

ビット演算を使用したものです. 二進数で考えたときのビット位置で判定します. 以下に例を示します. #define BitValue(n) (1<<(n)) #define FLAG0 BitValue(0) // == 00000001 #define FLAG1 BitValue(1) // == 00000010 #define FLAG2 BitValue(2) // == 00000100 /* ビット位置を利用した引数による関数 */ void func(unsigned char flag) { // 以下のような処理をビットマスクと言います. if ( flag & FLAG0 ); // フラグ0がセットされた時. if ( flag & FLAG1 ); // フラグ1がセットされた時. if ( flag & FLAG2 ); // フラグ2がセットされた時. } int main (void) { func(FLAG0 | FLAG2); // == 00000100 | 00000001 == 00000101 return 0; } このような感じでFLAGの定数をどんどん2^n乗していけばどんどんフラグは増やせます. 但し,sizeof(型)*8 以上の定数を宣言すると,比較できないので注意してください.

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

「ビット演算する」との回答ばかりですが、MessageBoxのフラグについては、もう少し複雑です。 intが32ビットの環境では、intを4ビットづつに切れば「4×8」で、8個のパラメータを1つの引数で受け渡し出来ます。 例えばMessageBoxは 0~3ビットは、ボタンの数と種類 4~7ビットは、アイコンの種類 になっています。 #define MB_OKCANCEL 0x00000001 #define MB_ICONEXCLAMATION 0x00000030 であれば、MB_OKCANCEL|MB_ICONEXCLAMATIONは0x00000031になります。 この引数をcFlagに受け取った関数は if ((cFlag & 0x0000000f) == MB_OKCANCEL) とか if ((cFlag & 0x000000f0) == MB_ICONEXCLAMATION) とかのように判定します。 この他、int1つに複数のパラメータを重ねて使用する例として 0~15ビットは、キーのリピートカウント 16~23ビットは、キーのスキャンコード 24ビットは、拡張キーの有無 25~28ビットは、未使用 29ビットは、context codeのフラグ 30ビットは、previous key stateのフラグ 31ビットは、transition stateのフラグ などという使い方をしている物もあります。

関連するQ&A