9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++Advent Calendar 2021

Day 6

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

Last updated at Posted at 2021-12-06

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

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
$(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

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

$(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

参考リンク

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?