コンパイラ オプションに関するマクロ
これらのマクロは、特定のコンパイラ機能を制御します。
マクロ | 説明 |
---|---|
_ATL_ALL_WARNINGS |
プロジェクトのエラーを以前のバージョンの ATL から変換できるようにするシンボル。 |
_ATL_APARTMENT_THREADED |
1 つ以上のオブジェクトでアパートメント スレッドが使用されているかどうかを定義します。 |
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS |
特定の CString コンストラクターを明示的にし、意図しない変換を防止します。 |
_ATL_ENABLE_PTM_WARNING |
C++ 標準構文を必要にするには、このマクロを定義します。 非標準構文を使用してメンバー関数へのポインターを初期化すると、C4867 コンパイラ エラーが生成されます。 |
_ATL_FREE_THREADED |
1 つ以上のオブジェクトでフリー スレッドまたはニュートラル スレッドが使用されているかどうかを定義します。 |
_ATL_MODULES |
permissive-で ATL プロジェクトをコンパイルし、C++ モジュールで ATL を使用できます。 |
_ATL_MULTI_THREADED |
プロジェクトに Both、Free、Neutral としてマークされたオブジェクトがあることを示すシンボル。 代わりにマクロ _ATL_FREE_THREADED を使用する必要があります。 |
_ATL_NO_AUTOMATIC_NAMESPACE |
ATL としての名前空間の既定の使用を禁止するシンボル。 |
_ATL_NO_COM_SUPPORT |
COM 関連のコードがプロジェクトでコンパイルされないようにするシンボル。 |
ATL_NO_VTABLE |
クラスのコンストラクターとデストラクターで vtable ポインターが初期化されないようにするシンボル。 |
ATL_NOINLINE |
関数をインラインにしてはならないことを示すシンボル。 |
_ATL_SINGLE_THREADED |
すべてのオブジェクトで単一のスレッド モデルを使用するかどうかを定義します。 |
_ATL_ALL_WARNINGS
プロジェクトのエラーを以前のバージョンの ATL から変換できるようにするシンボル。
#define _ATL_ALL_WARNINGS
解説
Visual C++ .NET 2002 より前は、ATL によって多くの警告が無効にされ、ユーザー コードに示されないように無効のままになっていました。 具体的には、次のように使用します。
C4127 条件式が定数です
C4786 '識別子': 識別子がデバッグ情報では '数値' 文字に切り詰められました
C4201 非標準の拡張機能が使用されています: 無名の構造体または共用体です
C4103 'ファイル名': #pragma パックを使用して配置を変更しました
C4291 '宣言': 初期化コードが例外をスローすると、'new' 演算子を使用しているとメモリを解放しません
C4268 '識別子': オブジェクトをゼロで埋めるコンパイラが生成した既定のコンストラクターで 'const' static/global データは初期化されました
C4702 到達できないコード
以前のバージョンから変換されたプロジェクトでは、これらの警告はライブラリ ヘッダーによってまだ無効になっています。
この動作を変更するには、ライブラリ ヘッダーを含める前に、 pch.h
(Visual Studio 2017 以前のstdafx.h
) ファイルに次の行を追加します。
#define _ATL_ALL_WARNINGS
#define
を追加すると、ATL ヘッダーによってこれらの警告の状態が保持され、グローバルに無効にされなくなります (または、ユーザーが個々の警告を明示的に無効にした場合、有効にされません)。
新しいプロジェクトでは、この #define
が pch.h (Visual Studio 2017 以前のでは stdafx.h) において既定で設定されます。
_ATL_APARTMENT_THREADED
1 つ以上のオブジェクトでアパートメント スレッドが使用されているかどうかを定義します。
_ATL_APARTMENT_THREADED
解説
アパートメント スレッドを指定します。 その他のオプション、および ATL オブジェクトで使用できるスレッド モデルの説明については、プロジェクトのスレッド モデルの指定に関する記事および「オプション、ATL シンプル オブジェクト ウィザード」を参照してください。
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
特定の CString
コンストラクターを明示的にし、意図しない変換を防止します。
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
解説
このコンストラクターを定義すると、1 つのパラメーターを受け取るすべての CString
コンストラクターが明示的なキーワードを使用してコンパイルされ、入力引数の暗黙的な変換が防止されます。 つまり、たとえば、 _UNICODE
が定義されている場合、 char*
文字列を CString
コンストラクター引数として使用しようとすると、コンパイラ エラーが発生します。 ナロー文字列型とワイド文字列型の間で暗黙的な変換が行われないようにする必要がある場合は、このマクロを使用してください。
すべてのコンストラクター文字列引数で _T
マクロを使用すると、 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
を定義し、 _UNICODE
が定義されているかどうかに関係なくコンパイル エラーを回避できます。
_ATL_ENABLE_PTM_WARNING
このマクロは、メンバー関数へのポインターに対して ANSI C++ 標準準拠の構文を強制的に使用するために定義します。 このマクロを使用すると、非標準構文を使用してメンバー関数へのポインターを初期化するときに C4867 コンパイラ エラーが生成されます。
#define _ATL_ENABLE_PTM_WARNING
解説
ATL および MFC ライブラリは、Microsoft C++ コンパイラの向上した標準 C++ への準拠と一致するように変更されました。 ANSI C++ 標準によれば、クラス メンバー関数へのポインターの構文はで &CMyClass::MyFunc
ある必要があります。
_ATL_ENABLE_PTM_WARNING
が定義されていない場合 (既定のケース)、ATL/MFC はマクロ マップ (特にメッセージ マップ) で C4867 エラーを無効にして、以前のバージョンで作成されたコードを以前と同様にビルドし続けることができます。 _ATL_ENABLE_PTM_WARNING
を定義する場合、コードは C++ 標準に準拠している必要があります。
ただし、標準以外の形式は非推奨になりました。 既存のコードを C++ 標準の構文に移動する必要があります。 コード例を次に示します。
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, OnMycommand)
END_MESSAGE_MAP()
次のように変更する必要があります。
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()
マップ マクロの場合は、アンパサンド '> 文字を追加します。 コードに再び文字を追加しないでください。
_ATL_FREE_THREADED
1 つ以上のオブジェクトでフリー スレッドまたはニュートラル スレッドが使用されているかどうかを定義します。
_ATL_FREE_THREADED
解説
フリー スレッドを指定します。 フリー スレッドは、マルチスレッド アパートメント モデルと同じです。 他のスレッド オプションについては、プロジェクトのスレッド モデルの指定に関する記事を参照してください。ATL オブジェクトで使用できるスレッド モデルの説明については、「オプション、ATL シンプル オブジェクト ウィザード」を参照してください。
_ATL_MODULES
permissive-
を使用して ATL プロジェクトをコンパイルし、C++ モジュールで ATL を使用できます。
_ATL_MODULES
_ATL_MULTI_THREADED
プロジェクトに Both、Free、Neutral としてマークされているオブジェクトがあることを示すシンボル。
_ATL_MULTI_THREADED
解説
このシンボルが定義されている場合、ATL はグローバル データへのアクセスを正しく同期するコードをプルします。 新しいコードでは、代わりに同等のマクロ _ATL_FREE_THREADED
を使用する必要があります。
_ATL_NO_AUTOMATIC_NAMESPACE
ATL としての名前空間の既定の使用を禁止するシンボル。
_ATL_NO_AUTOMATIC_NAMESPACE
解説
このシンボルが定義されていない場合( atlbase.h
を含む)、既定で using namespace ATL
が実行されるため、名前の競合が発生する可能性があります。 これを回避するには、このシンボルを定義します。
_ATL_NO_COM_SUPPORT
COM 関連のコードがプロジェクトでコンパイルされないようにするシンボル。
_ATL_NO_COM_SUPPORT
ATL_NO_VTABLE
クラスのコンストラクターとデストラクターで vtable ポインターが初期化されないようにするシンボル。
ATL_NO_VTABLE
解説
vtable ポインターがクラスのコンストラクターとデストラクターで初期化されていない場合、リンカーによって、その vtable と、それが指すすべての関数が除去される可能性があります。 __declspec(novtable)
に展開します。
例
class ATL_NO_VTABLE CMyClass2 :
ATL_NOINLINE
関数をインラインにしてはならないことを示すシンボル。
ATL_NOINLINE inline
myfunction()
{
...
}
パラメーター
myfunction
インライン化すべきではない関数。
解説
ヘッダー ファイルに配置できるようにインラインとして宣言する必要がある場合でも、関数がコンパイラによってインライン化されないようにするには、このシンボルを使用します。 __declspec(noinline)
に展開します。
_ATL_SINGLE_THREADED
すべてのオブジェクトで単一のスレッド モデルを使用する場合に定義します
_ATL_SINGLE_THREADED
解説
オブジェクトが常にプライマリ COM スレッドで実行されることを指定します。 他のスレッド オプションについては、プロジェクトのスレッド モデルの指定に関する記事を参照してください。ATL オブジェクトで使用できるスレッド モデルの説明については、「オプション、ATL シンプル オブジェクト ウィザード」を参照してください。