CやC++のプログラムを書くときには環境依存が出てくるときがあります。たとえばMacでもWindowsでも同一のソースから動かしたいとなると場合によっては#ifdefを用いて分岐をさせる必要が出てきます。しかし、コンパイルする環境に応じて適切な#defineを定義するなり、gccであれば-Dオプションを用いてdefineすることになります。ところが、gccの場合にはあらかじめ定義されているマクロがあります。それを用いることで処理系依存の部分を簡単かつ確実に分岐させることができるようになります。
この話はかなり処理系依存の話になります。言語仕様として定義することが要求されているものもありますが、基本的には処理系依存を切り分けるための手段としてとらえておくのがよいでしょう。
さて、前置きが長くなりましたが本題に入りましょう。調べ方は簡単です。Unix系であればcpp -dM /dev/nullとしWindowsであればMinGWやCygwinにパスが通った環境でcpp -dM NULとしましょう。cppはプリプロセッサーです。このコマンドを実行すると定義済みマクロの一覧がずらずらと出てきます。例を示したいところですが、長くなってしまうのでいくつか判別に使えそうなマクロを例示しましょう。
- __APPLE__
Macのgccで定義されていました。 - __unix__
CygwinとUbuntuのgccで定義されていました。Macではなぜか定義されていません。Mac OS XはちゃんとUNIXの認証をとっているんですけどなぜでしょう。 - __linux__
Ubuntuのgccで定義されていました。 - _WIN32
MinGWのgccで定義されていました。(32bit Windows XP)
マイクロソフトのドキュメントによればVisual Studioでは64bit環境でも常に定義されているようです。おそらくWindowsを判別するにはこれがベストでしょう。
by Y.O