このページでは、#define で定義されたシンボルが MIDL コンパイラによって生成された H ファイルから消える理由と、それに関して何ができるかについて説明します。 この説明は、*.idl、*.acf、*.h ファイルなど、MIDL によって処理されるすべてのファイルに適用されます。
#define シンボルの消失は、MIDL が入力ファイルの前処理をプリプロセッサに委任した結果です。 既定では、プリプロセッサはビルド環境の C/C++ プリプロセッサです。 前処理後、MIDL が受け取る入力ストリームには、プリプロセッサ ディレクティブ #line しかありません。 特に、プリプロセッサは入力ファイル内のすべてのマクロ定義の登録を解除するため、MIDL はその存在を検出できません。 したがって、MIDL が入力ファイルから生成された H ファイルに型定義をレプリケートする場合、#defines はレプリケートされません。 そのため、生成された H ファイルから後で使用する場合は、IDL ファイルで #defines を直接使用しないでください。
次の 4 つの回避策をお勧めします。
- const 宣言仕様を使用します。
- IDL ファイルにインポートまたはインクルードされ、後で C ソース コードに含まれる個別のヘッダー ファイルを使用します。
- IDL ファイルで列挙定数を使用します。
- cpp_quote を使用して、生成されたヘッダー ファイル内の #define を再現します。
マニフェスト定数は、IDL 定数宣言構文使用して再現できます。 IDL 定数宣言の const は C/C++ const セマンティクスとは異なり、単に IDL コンパイル用の名前付き定数を導入します。 例えば:
const short ARRSIZE = 10
この例では、ARRSIZE が値10の定数であることを指定します。 名前付き定数は、IDL 配列宣言子や、C プログラマがマニフェスト定義を使用するその他の場所で使用できます。 さらに、この構文により、ヘッダー ファイルに次の行が生成されます。
#define ARRSIZE 10
**#**define ステートメントを処理するもう 1 つの方法は、ステートメントを個別のヘッダー ファイルにパッケージ化して、**#**define ステートメント専用のファイルに、または型定義のみを含むファイルにパッケージ化することです。 プリプロセッサ ディレクティブのみを含むファイルは、IDL ファイルと C ソース ファイルの両方で安全にインクルードできます。 ディレクティブは MIDL コンパイラによって生成されたヘッダー ファイルでは使用できませんが、C ソース プログラムには個別のヘッダー ファイルを含めることができます。 同様に、**#**define ステートメントと通常の型定義を含むヘッダー ファイルを IDL ファイルからインポートできます。 この方法では、**#**define ステートメントと typedef ステートメントを H ファイルで使用してカプセル化し、インポートする IDL ファイルで **#**define シンボルが直接使用されないようにします。 ヘッダーまたは IDL ファイルを別の IDL ファイルにインポートすると、MIDL によって生成された H ファイル (**#**include ステートメントとは異なります) に typedef ステートメントがレプリケートされなくなります。 この方法により、生成された H ファイルに沿って C コードから元のヘッダー ファイルを安全に参照でき、重複した定義に問題はありません。
IDL ファイルでの列挙定数の使用も有効です。 これらの定数は、IDL の定数式 (配列宣言子など) で使用できます。 列挙定数は、C コンパイラ プリプロセッサによる MIDL コンパイルの初期段階では削除されないため、列挙定数は MIDL コンパイラによって生成されたヘッダー ファイルで使用できます。 次のステートメントについて考えてみましょう。
typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };
このステートメントは、C プリプロセッサによる MIDL コンパイル中は削除されず、typedef は生成された H ファイルにレプリケートされます。 定数 MAXSTRINGCOUNT は、MIDL コンパイラによって生成されたヘッダー ファイルを含む C ソース プログラムで使用できます。
最後に、MIDL の cpp_quote ディレクティブを使用して、生成された H ファイルに任意の文字列を直接書き出すことができます。 たとえば、このページで以前に使用したマニフェスト定数を cpp_quoteで取得するには、次のステートメントを使用できます。
cpp_quote ("#define ARRSIZE 10")
このステートメントにより、ヘッダー ファイルに次の行が生成されます。
#define ARRSIZE 10