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が必要になる。
具体的には
っぽい。
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すればいけそうな感じ。