下記に示す、Cのサンプルプログラムの文字マクロの部分がわからず、困っています。
ソースの実行環境の違いを吸収するための部分であることはわかるのですが、どうしてこのようにて定義されたのかがわかりません。
特に、

●__MINGW32__とは何か?
●#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)のところで、なぜ||と&&を併用しているのか。&& !defined(__MINGW32__)がどうして必要なのか?
●C##UI64、C##UL、C##ULLはそれぞれ何なのか?
●__arch64__は何か?なぜ必要なのか?
●なぜ、下のソース(文字マクロ部分)のdefineの流れになったのか?

のあたりがわかりません。よろしくお願いします。


----------------------------------------------------------------------
#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)
typedef unsigned __int64 u64;
#define U64(C)C##UI64
#elif defined(__arch64__)
typedef unsigned long u64;
#define U64(C)C##UL
#else
typedef unsigned long long u64;
#define U64(C)C##ULL
#endif
----------------------------------------------------------------------

このQ&Aに関連する最新のQ&A

A 回答 (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になっているので、それに設定する
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ありません。

詳しいご回答ありがとうございました。

ありがとうございました!

お礼日時:2011/04/22 21:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報