Windowsの基本っぽいヘッダファイル

小ネタ。というか、自分用のメモ。
bccのv5.82環境(TurboC++)でwindows.hを読まずに最小限のヘッダをincludeするとどれなのか調べてみた。
(PCがしょぼいとコンパイル遅いので…orz)

各ヘッダに入ってそうな定義類

.hの中身を見て確認したらざっとこんなものが入っているみたいだった。

ヘッダファイル 主な内容 イメージ
windef.h UINTなどの型定義
WINAPI_INLINEなど関数修飾系の定義
HWNDなど各種ハンドル定義
その他RECTやMAX_PATHなど
最低限?の定義類
winbase.h APIの関数プロトタイプ
APIで使う構造体
APIで使うdefine
最低限?のAPI関連
winnt.h PVOID定義(えっ?ここで定義?)
LPSTRなど文字列系定義
HRESULT定義
STDAPIなど関数修飾系の定義
APIの関数プロトタイプ
APIで使う構造体
APIで使うdefine
windef.h、winbase.hに入ってないもの。
NT以降のもの?

include前に必要なdefine

winnt.hの中でCONTEXT構造体(中身はCPUのレジスタ。スレッドのコンテキスト情報かな…)を定義していて、CPUのアーキテクチャごとに定義が分かれている。そこでCPUアーキテクチャ定義のdefineが必要になる。
具体的には

  • i386(32ビット環境)なら「_X86_」
  • x86_64(64ビット環境)なら「_AMD64_」

っぽい。

windows.hだとこのあたりを自動でdefineするみたいだけど、手動includeなので自前defineが必要。
「_M_IX86」みたいなのをコンパイラが定義するっぽいのでこれで分ければ良さそう。

コンパイラが本当にdefineしているかは、以下のコードで確認してみた。(確認した環境はXE3環境)

#ifdef _M_IX86
	#error "_M_IX86 defined"
#elif defined(_M_AMD64)
	#error "_M_AMD64 defined"
#else
	#error "who are you?"
#endif

実行結果はこっち。

c:\work\dairy>bcc32 -c test_20130226.cpp
Embarcadero C++ 6.50 for Win32 Copyright (c) 1993-2012 Embarcadero Technologies, Inc.
test_20130226.cpp:
致命的エラー F1003 test_20130226.cpp 2: error 指令: "_M_IX86 defined"
*** 1 個のエラーがコンパイル中に発生しました ***
C:\work\dairy>bcc64 -c test_20130226.cpp
Embarcadero C++ 6.50 for Win64 Copyright (c) 2012 Embarcadero Technologies, Inc.

test_20130226.cpp:
test_20130226.cpp:4:3: error: "_M_AMD64 defined"
#error "_M_AMD64 defined"
^
1 error generated.

ということで、想定通り。

最小?include

まとめるとこんな感じのinclude類になりそう。

// winnt.hで必要(普段はwindows.hが定義している)
#ifdef _M_IX86          // コンパイラが定義しているはず
#define _X86_
#else
#define _AMD64_
#endif
#include <windef.h>     // 基本的な定義類
#include <stdarg.h>     // winbase.hに必要
#include <winbase.h>    // 他の各種API向けヘッダに必要そう
#include <winnt.h>      // windef, winbaseで足りない分(実はwindefが内部でincludeしてる)

という感じ。ソース中のコメントの通り、winnt.hについては省略可能なはず。
あとは必要に応じて各種API向けのヘッダを追加でincludeすればいけそうな感じ。