プリプロセッサ指令

H2cpy では、#include 指令と #define 指令の両方が処理されます。

#include 指令の変換

H2cpy は、次の形式の #include 指令を変換します。

#include<name> name は、拡張子を含むファイル名か、相対パスを含むファイル名です。
#include"name" name は、拡張子を含むファイル名、相対パスを含むファイル名、または絶対パスを含むファイル名です。
#includemacro macro は、上記のどちらかの形式に展開されます。

H2cpy は指定されたファイルを検索し、見つかったファイルから C のソースを読み取ります。指定ファイルの末尾に到達すると、参照側のファイルに戻って解釈を続行します。

#include 指令には、ファイルの絶対パスを指定する必要はありません。ファイル名を二重引用符 (") で囲んで指定すると、最初に現在のディレクトリが検索され、続いてインクルード ファイルの検索パス リストに登録された各ディレクトリが順次検索されます。

山かっこ (<>) で囲んだファイル名はシステムのヘッダー ファイルと見なされ、インクルード ファイルの検索パス リスト内のディレクトリのみが検索されます。現在のディレクトリは検索されません。

検索パス リストには、検索対象のディレクトリが絶対パスで最大 14 件登録されています。ファイルは、そのファイルが見つかるか、または検索リストが終了するまで、各ディレクトリで順に検索されます。ファイルが見つからないままリスト内の全ディレクトリの検索が終了すると、エラー メッセージが表示されます。

-I オプションを使用すれば、検索パス リストの先頭に任意のディレクトリを追加できます。このオプションについては、コマンド ライン オプションのセクションの説明を参照してください。

検索パス リストには、初期状態で /usr/include ディレクトリが登録されています。なお、H2cpy はパスを構成する各ディレクトリ名の区切り文字として半角の円記号 (\) を使用するため、検索パスに含まれるスラッシュ (/) は検索の開始前にすべて円記号に変換されます。

例えば、INCLUDE 環境変数を次のように設定した場合を考えてみましょう。

include=d:\include;e:\sys\include 

この場合、次の #include 指令を検出すると、

#include <Xm/Xm.h>

H2cpy は d:¥include¥XmXm.h を検索し、続いて e:\sys\include\Xm\Xm.h を検索します。

デフォルト パス (/usr/include) を使用している場合は、次の #include 指令を検出すると、

#include <Xm/Xm.h>

/usr/include/Xm/Xm.h のみが検索されます。

#define 指令の変換

H2cpy はマクロをパラメーターの有無にかかわらず変換します。C のソース内でマクロ名を検出すると、H2cpy はその定義を保持し、該当するマクロを展開します。1 つのマクロには任意数の C 言語のトークンを定義することが可能であり、通常は COBOL のコードに直接変換することはできません。

H2cpy は、次のマクロ定義を COBOL の 78 レベル項目に変換します。

  • 単一の C 文字列リテラル、文字定数、整数定数、または浮動小数点定数
  • 単一の整数定数に評価される数値定数式

C 言語の同一のトークンによって、大文字と小文字の両方で定義されているマクロは無視されます。これらの定義に相違があると、エラー メッセージが表示されます。

マクロ名の定義は、#undef 指令を使用すれば解除できます。