Visual C++ プロジェクト(.vcxproj) を新規作成した場合に定義されるプリプロセッサマクロ 

# デフォルト定義プリプロセッサマクロの一覧

Visual C++ プロジェクト(.vcxproj) を新規作成した場合に、プロジェクトに対して自動定義されるプリプロセッサマクロを一覧し、その意味をまとめた。
これらの定義マクロは、テンプレートから自動生成されたソース内やシステムヘッダ内にて `#if defined(定義マクロ)` の形で参照される。 
システム関数およびユーザプログラムの両方に影響を与えるので意味をしっかり理解しておきたい。

## 構成＞C/C++＞プリプロセッサ＞プリプロセッサの定義(ClCompile.PreprocessorDefinitions) に直接定義されるマクロ

プロジェクト作成時に、プロジェクトテンプレートに従って初期設定される。

| 定義マクロ | 条件 | 意味,用途 |
|:---------|:----|:----|
|WIN32     |Platform=Win32(x86)   | Windows 32bit 用ビルド
|NDEBUG    |Configuration=Release | リリース版ビルド, デバッグ用コードを無効化する
|_DEBUG    |Configuration=Debug   | デバッグ版ビルド, デバッグ用コードを有効化する
|*PROJECTNAME*_EXPORTS|構成の種別=DLL | DLLの外部公開エントリをエクスポートに設定する
|_WINDOWS  |WindowsアプリまたはDLL | Windows用である.
|_CONSOLE  |コンソールプロジェクト | コンソールアプリである.
|_USRDLL   |構成の種類=DLLかつ、非MFC拡張DLL | MFC拡張DLLでない.
|_AFXEXT   |構成の種別=DLLかつ、MFC拡張DLL | MFC拡張DLLである.
|_LIB      |構成の種別=LIB | 静的ライブラリである.

## 構成＞詳細＞文字セット(CharacterSet)に従って自動的に設定されるマクロ

文字セットを選ぶと、プロパティマネージャの構成ツリーに `Unicode Support`, `Multi-byte Charactor Support` が自動的に追加され、そのプロパティ設定内にて以下のマクロが定義される。

| 定義マクロ | 条件 | 意味 |
|:---------|:----|:----|
|_MBCS     |文字セット＝マルチバイト|C言語ランタイムライブラリの _tcs関数/_Tマクロ/TCHARをchar版にする
|_UNICODE  |文字セット＝ユニコード  |C言語ランタイムライブラリの _tcs関数/_Tマクロ/TCHARをwchar_t版にする
|UNICODE   |文字セット＝ユニコード  |WindowsSDK関数名と構造体、LPTSTR,LPTCSTRをchar版からwchar_t版にする

- WindowsSDKはデフォルトでchar版であり、マクロMBCSの定義は不要である。UNICODE が定義されることで、wchar_t 版に変わる。
- 文字セット＝設定なし を選ぶと上記のマクロは定義されない。
- _UNICODE マクロ定義による `_tcs関数/_Tマクロ/TCHAR` の切り替えは `<tchar.h>` で行われる。
- UNICODE マクロ定義による `LPTSTR,LPTCSTR` の切り替えは `<winnt.h>` で行われる。
- UNICODE マクロ定義による WindowsSDK関数名と構造体の切り替え(例: MessageBox -> MessageBoxA/MessageBoxW) は各SDK関数プロトタイプ定義ヘッダ `<WinUser.h>, <WinGdi.h>, ...` で行われる。
- このマクロを定義しているプロパティファイルは下記の場所にある。

```
$(VCTargetsPath)Microsoft.Cpp.unicodesupport.props
19:      <PreprocessorDefinitions>_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
$(VCTargetsPath)Microsoft.Cpp.MultiByteCharSupport.props
19:      <PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
```

## 構成＞全般＞構成の種類(ConfigurationType)により自動的に設定されるマクロ

構成の種類を選ぶと、プロパティマネージャの構成ツリーに `Windows Dnyamic Link Libary`, `Dynamic Link to MFC` が自動的に追加され、そのプロパティ設定内にて以下のマクロが定義される。

| 定義マクロ | 条件 | 意味 |
|:---------|:----|:----|
|_WINDLL  |構成の種別=DLL | Windows Dynamic Link Library
|_AFXDLL  |MFCの利用=共有DLLでMFCを使う| Dynamic Link to MFC

- このマクロを定義しているプロパティファイルは下記の場所にある。

```
$(VCTargetsPath)Microsoft.Cpp.WinDLL.props
19:      <PreprocessorDefinitions>_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
$(VCTargetsPath)Microsoft.Cpp.mfcDynamic.props
19:      <PreprocessorDefinitions>_AFXDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
```


## 古いプロジェクトからのアップグレードによりプロパティ構成に追加されるマクロ

旧バージョンのVisual Studio ソリューションからアップグレードすると、プロパティマネージャの構成ツリーに `Upgrade from VC x.x` が明示的に追加され、そのプロパティ設定内にて以下のマクロが定義される。

| 定義マクロ | 条件 | 意味 |
|:---------|:----:|:----|
|_VC80_UPGRADE=0x0600 | Upgrade from VC 6.0
|_VC80_UPGRADE=0x0700 | Upgrade from VC 7.0
|_VC80_UPGRADE=0x0710 | Upgrade from VC 7.1

- このマクロは、`<afxres.h>` にて参照され、 IDR_MANIFEST の定義を行っている。それ以外にどういう働きがあるのか不明である。 
- 参考＞ https://social.msdn.microsoft.com/Forums/ja-JP/a7edd888-6724-439c-886f-f5c9830c1343/what-exactly-does-vc80upgrade0x0600-do?forum=vcgeneral
- このマクロを定義しているプロパティファイルは下記の場所にある。

```
$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props
19:      <PreprocessorDefinitions>_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC70.props
19:      <PreprocessorDefinitions>_VC80_UPGRADE=0x0700;%(PreprocessorDefinitions)</PreprocessorDefinitions>
$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC71.props
19:      <PreprocessorDefinitions>_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>
```


# 構成＞VC++ディレクトリ＞インクルードディレクトリ の内容

VC++において、プリプロセッサ命令 #include が、システム提供ヘッダファイルを探索するパスリストの設定である。
VC++インストール時に選ぶオプション選択により変化すると思われるが、私の環境では
 `$(VC_IncludePath);$(WindowsSDK_IncludePath)` と設定され、各マクロの展開値は以下の通りである。

#### $(VC_IncludePath)
``` 
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\atlmfc\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
```

※上記４つのパスに対し、それぞれ個別マクロ名が割り振られている。

```
$(VC_VC_IncludePath)
$(VC_ATLMFC_IncludePath)
$(VC_VS_IncludePath)
$(WinRT_IncludePath)
```
#### $(WindowsSDK_IncludePath) 
```
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\cppwinrt
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Include\um
```

## 参考リンク
https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-160