- ベストアンサー
C言語の文字マクロ部分についての疑問
- C言語で使用される文字マクロ部分についての疑問について質問します。
- 特に、__MINGW32__や__arch64__などの定義に関して疑問があります。
- また、#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)の意味もわかりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
●__MINGW32__とは何か? ターゲットがMinGWの時に定義されるマクロ。 MinGWが何者かは↓あたりを参照 http://ja.wikipedia.org/wiki/MinGW ●#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)のところで、なぜ||と&&を併用しているのか。&& !defined(__MINGW32__)がどうして必要なのか? ||や&&は C自体でも使われている論理演算子です。この意味はよろしいですか? MinGWで使われる gcc と、標準的にWindowsで使われる Visual C++とでは、細かい点で使用がことなります。 ターゲットがWindowsであることを示す _WIN32や_WIN64だけでは、この二つの区別ができません。 この行は「32bit Windowsか64bit Windows用だけども、MinGW用ではない」という条件になります。 ●C##UI64、C##UL、C##ULLはそれぞれ何なのか? ## は演算子で、二つの文字列を継げます。 C##UI64 の場合。このCは関数マクロの引数なので u64(10) と記述すると、コンパイル前に 10UI64 に置き換わります。 詳細は「C言語 マクロ 演算子」で検索 UL 等は「サフィックス」と呼ばれるもので、その定数が何型かを明示するものです。 通常、整数定数はint型です。 例: 10 → int型の10 サフィックスUを付けると「unsigned」Lを付けると「long」になります 例: 10UL → unsigned longの10 ●__arch64__は何か?なぜ必要なのか? gccで64bitCPUがターゲットのとき定義されるようです。 ●なぜ、下のソース(文字マクロ部分)のdefineの流れになったのか? この例の場合。 どの型が何ビット使うかは、環境によって違います。 プログラム中で符号無し64bit整数を扱いたい場合、特定ターゲット用ならそのターゲットに合せて型を選べばよいですが、移植を考えるとよくありません。また、型が違えばサフィックスも変わります。 そこで、符号無し64bit整数の型u64 と、u64の定数を表記するためのマクロ U64 を用意して、コンパイラによって自動で適切な型に定義させ、プログラム本体では極力変更が無いようにする、というのがこのマクロの目的です。 ・Visual C++はgccとは型もサフィックスも違うので、専用の定義を使う ・Windows用でもMinGWはgccを使うので、Visual C++用設定は使わない。 ・それ以外では、64bitCPUではlongが/32CPUでは long long が64bitになっているので、それに設定する
お礼
お礼が遅れて申し訳ありません。 詳しいご回答ありがとうございました。 ありがとうございました!