はじめに
C++でwin32APIを使う方法について調べているとサンプルコードの1行目からわからなかったので調べました。
#define STRICT
#include <windows.h>
#defineについて
CやC++において、コンパイルの前に行われるプロセッサ命令の一つで、マクロを定義してソースファイル内の文字列を置換します。
//マクロを定義
#define PI 3.14 //「PI」という文字列を「3.14」に置き換える
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << PI << endl; //3.14
#undef PI 3.14 //置換を無効化
cout << PI << endl; //エラー
}
詳しいことは下のページに書いていました。
#define STRICTについて
上の#defineと使い方が違うように見えます。
この#define STRICTはコンパイル時に厳密に型チェックを行うことを明示的に示します。
厳密な型チェックを指定することで、実行時エラーを減らすことにつながります。
逆に厳密な型チェックを無効にするには#define NO_STRICTを書きます。
どうやら古いWindowsの環境では厳密な型チェックがデフォルトで無効なため、win32APIを使うと登場するHWNDやHDCなどのHANDLE型がエラーを起こしていたようです。
だから#include <windows.h>の前に#define STRICTをというおまじないが生まれました。
現在はデフォルトで厳密な型チェックが行われますが、古い環境のことも考えると#define STRICTを最初に書く方が親切ということらしいです。
参考リンク
↓microsoftのページです。
https://learn.microsoft.com/ja-jp/windows/win32/winprog/enabling-strict
https://learn.microsoft.com/ja-jp/windows/win32/winprog/disabling-strict
https://learn.microsoft.com/ja-jp/windows/win32/winprog/strict-compliance