• ベストアンサー

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

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

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

そのような引数を作る場合は、通常以下の方法で行います。 1.引数の型をint型(又はそれに順ずるもの) 2.orを指定する引数は、orを行ったとき、個々の指定するビットが重ならないようにします。 例を示します。 void func(int bit_p) とします。 ここで #define SHITEI_A (0x01) #define SHITEI_B (0x02) #define SHITEI_C (0x04) #define SHITEI_D (0x08) とします。 呼び出すときに func(SHITE_A) func(SHITE_A|SHITEI_C) とすると bit_pは0x01か0x05となります。 ここで、SHITEI_A,....SHITE_Dはビットパターンでが1ビットだけがONであり、またONになる位置が異なっていることに着目してください。 (そのようになっていないとだめです) func側では、 SHITE_Aが指定されたかどうかは、(bit_p & SHITEI_A)の結果が0であれば、指定されていない。0以外なら、SHITE_Aが指定されていると判断することができます。 同様に、 (bit_p & SHITEI_B) を行えば、SHITEI_Bが指定されているかどうかを 判断できます。以降、同様。

Caya
質問者

お礼

解りやすい説明をありがとうございます。 ビットの位置が異なるような定義をして、関数内で&を使って 指定されたものを確認していくのですね! 頑張って関数を作ってみます。 ありがとうございました。

その他の回答 (1)

  • edge_wind
  • ベストアンサー率55% (44/79)
回答No.1

「|」は論理和演算子ですので、その論理和の値に従って、条件分岐を作成すれば大丈夫です。 参考までにMB_YESNOやMB_ICONQUESTIONが実際どのような値で定義されているかを、以下URLでご確認下さい。 http://www5c.biglobe.ne.jp/~ecb/c/05_04.html http://yokohama.cool.ne.jp/chokuto/advanced/msgbox.html

Caya
質問者

お礼

MessageBoxの引数は実際はこのように定義されているのですね。 HP教えていただいてありがとうございます!参考にします。 ありがとうございました。

関連するQ&A