IDLファイルでの#definesの処理
このページでは、 #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 ファイルからインポートできます。 この方法では、インポートする IDL ファイルで **#**define シンボルが直接使用されないように、H ファイルでそれらを使用して**#**define ステートメントと typedef ステートメントをカプセル化します。 ヘッダーまたは IDL ファイルを別の IDL ファイルにインポートすると、typedef ステートメントが MIDL によって生成された H ファイルにレプリケートされなくなります (これは **#**include ステートメントとは対照的です)。 この方法により、重複した定義に問題なく、生成された 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