C/C++のコンパイラーにあらかじめ実装されているプリプロセッサーマクロは、ソース中で定義しなくても利用することができます。

C言語のISO規格「Programming languages – C」

C言語のISO規格「ISO/IEC 9899 – Programming languages – C」で、C言語で標準化されているプリプロセッサーマクロとして次のものがあります。

__DATE__ ‐ コンパイル時の日付。”Mmm dd yyyy” 形式の文字列(例、”Oct 10 2010″)
__FILE__ ‐ コンパイルされるソースファイルのファイル名
__LINE__ ‐ 現在の行番号。10進数の定数で表わされる
__TIME__ ‐ ソースのコンパイル時刻。”hh:mm:ss” 形式の文字列 (例、”01:23:45″)

実際にC言語プリプロセッサーマクロを使ってみると次のようになります。

#include <stdio.h>

int main() {
        printf("LINE = %d\n" , __LINE__);
        printf("FILE = %s\n" , __FILE__);
        printf("DATE = %s\n" , __DATE__);
        printf("TIME = %s\n" , __TIME__);
        return 0;
}

OSによって定義されている実装独自の事前定義済みC言語マクロ

この他、実装独自の事前定義済みC言語マクロが多数存在します。また、OSによって定義されている次のようなものがあります。

__FreeBSD__ ‐ FreeBSDのすべての版で定義される
__NetBSD__
__linux__

Windows向けC言語関数とUNIXのC言語関数

C言語プログラムを作成していると、Windows向け関数とUNIXの関数を、動作しているOSによって変更したい場合があります。Windows向け関数とUNIXの関数の互換性を保つために、OSを区別してC言語をコンパイルする場合、次のように使用します。次の例では、Sleep関数の例を示します。

#ifdef _WINDOWS
   #include <windows.h>
#else
   #include <unistd.h>
   #define Sleep(x) usleep((x)*1000)
#endif

WindowsAPI等を使用する場合に、windows.hのincludeは必要です。ちなみに、Win32コンソールアプリでもWindowsAPIは使用可能ですから、その場合にも必要になります。なお、.NETテクノロジーによりC言語プログラミングをする場合では、windows.hをインクルードしません。この場合、.NET Frameworkの機能をプロジェクトに組み込みます。

GNUのC言語コンパイラ「GCC」で定義済みのC言語マクロの調査

Cコード中でデフォルトで定義されるマクロ (__i386__ 等) を調べたい場合は、以下のコマンドで出力することができます。。

$ gcc -E -dM -xc /dev/null

-Eオプションがプリプロセスで終了するオプション、-dMオプションでプリプロセス終了時に有効だったマクロ定義の出力となります。