インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
すべての fpp プリプロセッサー・ディレクティブは、行の先頭にシャープ記号 (#) が付きます。最初の "#" の後に、インデント用の余白 (ブランクまたはタブ文字) がくることもあります。
fpp プリプロセッサー・ディレクティブは、ソースコードの任意の場所で (Fortran 継続行の前であっても) 指定できます。ただし、マクロ呼び出し内の fpp プリプロセッサー・ディレクティブを、継続記号により複数行に分けることはできません。
fpp プリプロセッサー・ディレクティブは、用途ごとに分類することができます。
次の fpp プリプロセッサー・ディレクティブは、プログラムで代入を行います。
プリプロセッサー・ディレクティブ |
結果 |
---|---|
__FILE__ |
この文字列を入力ファイル名 (文字列) に置換します。 |
__LINE__ |
この文字列を入力ファイル中の現在の行番号 (整数定数) に置換します。 |
__DATE__ |
この文字列を fpp が入力ファイルを処理した日付 (Mmm dd yyyy 形式の文字列) に置換します。 |
__TIME__ |
この文字列を fpp が入力ファイルを処理した時間 (hh:mm:ss 形式の文字列) に置換します。 |
__TIMESTAMP__ |
この文字列を fpp が入力ファイルを処理した時間 ("day date time year" 形式の文字列) に置換します。day は 3 文字からなる曜日の省略形、date は Mmm dd、time は hh:mm:ss、year は yyyy になります。 |
外部ファイルをインクルードするには、プリプロセッサー・ディレクティブ #include を次のいずれかの形式で指定します。
#include "filename"
#include <filename>
#include は、指定されたファイル内容を、ソースファイルの指定された位置またはデフォルトの位置に読み取ります。ファイルから読み取られる行は、fpp により、同一ファイルの一部のように処理されます。
<filename> 形式を使用する場合、filename は、標準の "include" ディレクトリー内でのみ検索されます。詳細は、「Fortran プリプロセッサー・オプションの使用」の -I オプションまたは -Y オプションの説明を参照してください。ディレクティブ行の最後にある '"' または ">" の後にトークンを追加することはできません。
#include "filename" の場合、filenames は次の順に検索されます。
ソースファイルがあるディレクトリー
-I オプションまたは -Y オプションによって指定されたディレクトリー
デフォルト・ディレクトリー
#include <filename> の場合、filenames は次の順に検索されます。
-I オプションまたは -Y オプションによって指定されたディレクトリー
デフォルト・ディレクトリー
プリプロセッサー・ディレクティブ #line-number は、Fortran コンパイラーの行制御情報を生成します。次の形式で指定します。
#line-number "filename"
#line-number は、次の行の号番号を示す整数定数です。"filename" は、行が含まれているファイルの名前です。"filename" が指定されていない場合は、現在のファイル名が使用されます。
プリプロセッサー・ディレクティブ #define は、単純な文字列変数とより複雑なマクロの両方の定義に使用されます。次の 2 つの形式があります。
fpp 変数の定義:
#define name token-string
この形式では、ソースファイル中の name は、token-string に置換されます。
fpp マクロの定義:
#define name(argument[,argument] ... ) token-string
この形式では、マクロ名 name とそれに続く括弧で囲まれた実引数のカンマ区切りリストは、token-string に置換されます。また、token-string 中の各 argument は、マクロ呼び出しの対応する実引数を表すトークンシーケンスに置換されます。
マクロ呼び出し引数の数が、対応するマクロ定義の引数の数と異なる場合、エラーとなります。例えば、次のマクロ定義について考えてみます。
#define INTSUB(m, n, o) call mysub(m, n, o)
マクロ INTSUB を使用する際には、常に 3 つの引数が必要です。マクロ定義では、マクロ名と開き括弧 "(" の間にスペースを挿入することは禁止されています。これは、マクロ定義が、開き括弧 "(" で始まる token-string を持つ fpp 変数定義として解釈されないようにするためです。
fpp 変数定義またはマクロ定義は、任意の長さにすることが可能で、改行記号によって制限されます。複数行に渡って定義する場合は、行末に "\" を挿入してから次の行に移ります。次に例を示します。
#define long_macro_name(x,\ y) x*y
"\" を挿入せずに改行すると、マクロ定義の終了と見なされます。
定義の有効範囲は、#define から現在のファイルの最後までで、その間のすべてのソース行 (および #include ファイルのソース行) が含まれます。ただし、次のものは除きます。
Fortran INCLUDE 文によってインクルードされているファイル
fpp コメントおよび Fortran コメント
1 文字を指定する Fortran IMPLICIT 文
Fortran FORMAT 文
数値、データ型のないもの、文字定数
プリプロセッサー・ディレクティブ #undef の形式は次のとおりです。
#undef name
このプリプロセッサー・ディレクティブは、(D オプション、#define プリプロセッサー・ディレクティブ、またはデフォルトによる) name の定義をすべて削除します。ディレクティブ行の name の後にトークンを追加することはできません。
name が定義されていない場合、#undef は効果がありません。
マクロの展開時に、行のカラム幅が 72 (固定形式) または 132 (自由形式) を超える場合、fpp は適切な Fortran の継続行を挿入します。
固定形式の場合、ラベルフィールドにおけるマクロの展開には制限があります (位置 1-5):
マクロ呼び出し (指定可能な引数を含む) は、カラム 5 を超えてはなりません。
Fortran のコメント記号で始まる名前のマクロ呼び出しは、コメントの一部と見なされます。
マクロの展開は、カラム 5 を超えるテキストを生成することがあります。この場合、警告が表示されます。
固定形式で -Xw オプションが指定されると、マクロ呼び出しが文の位置で発生し、マクロ名が Fortran のキーワードで始まる場合や Fortran のキーワードと同じ場合、あいまいな状況が発生します。次の例について考えてみます。
#define callp(x) call f(x) call p(0)
この例では、fpp は callp をどのように解釈すべきか判断できません。マクロ名と見なされる可能性もあります。現在の実装では、次のことが行われます。
長い識別子 (この例では、callp) が選択されます。
この識別子から、最も長いマクロ名またはキーワードが抽出されます。
マクロ名が抽出された場合、マクロが展開されます。名前がキーワードで始まっている場合、fpp は適切な警告を表示します。
識別子の残りは、識別子全体と見なされます。
上の例では、マクロが展開され、次の警告が表示されます。
警告: マクロ callp の代入が正しくない可能性があります。
この警告は、固定形式のコードの前処理で、スペースが区切り文字として解釈されない場合にのみ表示されます。
次の場合は、マクロ名がキーワードと同じです。
#define INT INTEGER*8 INTEGER k
INTEGER キーワードは、INT マクロ名よりも先にあります。このようなマクロ定義の前処理では、警告は表示されません。
次の 3 つのプリプロセッサー・ディレクティブは、ソーステキストを選択するための条件付き構造です。
#if プリプロセッサー・ディレクティブ
#if を指定すると、condition が .TRUE. の場合のみ、対応する #else、#elif、または #endif プリプロセッサー・ディレクティブまでの行が出力されます。次に例を示します。
#if condition_1 block_1 #elif condition_2 block_2 #elif ... #else block_n #endif
#ifdef プリプロセッサー・ディレクティブ
#ifdef を指定すると、#define プリプロセッサー・ディレクティブまたは D コンパイラー・オプションにより name が定義され、介在する #undef プリプロセッサー・ディレクティブがない場合のみ、対応する #else, #elif または #endif までの行が出力されます。プリプロセッサー・ディレクティブ行の name の後にトークンを追加することはできません。次に例を示します。
#ifdef name block_1 #elif condition block_2 #elif ... #else block_n #endif
#ifndef プリプロセッサー・ディレクティブ
#ifndef を指定すると、name が定義されていない場合、または #undef ディレクティブにより定義が削除されている場合のみ、対応する #else, #elif または #endif までの行が出力されます。ディレクティブ行の name の後にトークンを追加することはできません。次に例を示します。
#ifndef name block_1 #elif condition block_2 #elif ... #else block_n #endif
#else、#elif、#endif プリプロセッサー・ディレクティブはオプションです。上記のプリプロセッサー・ディレクティブで使用できます。
次の条件すべてを満たす場合のみ、対応する #else, #elif または #endif までの行が出力されます。
先行する #if ディレクティブが .FALSE. の場合、先行する #ifdef ディレクティブの name が定義されていない場合、または先行する #ifndef ディレクティブの name が定義されている場合。
先行するすべての #elif ディレクティブの条件が .FALSE. の場合。
現在の #elif の条件が .TRUE. の場合。
#if ディレクティブで許可されている条件がすべて #elif ディレクティブでも許可されている場合。#if、#ifdef、または #ifndef ディレクティブと対応する #else ディレクティブまたは #endif ディレクティブの間に #elif がある場合。
条件式
condition_1、condition_2、などは、fpp 定数、マクロ、組込み関数を含む論理式です。条件式では、次の演算子を使用できます。
C 言語の演算子: <, >, ==, !=, >=, <=, +, -, /, *, %, <<, >>, &, ~, |, &&, および ||
fpp は、C 言語のセマンティクスに従って、これらの演算子を解釈します。この機能は、cpp を使用する以前の Fortran プログラムとの互換性のために提供されています。
Fortran 演算: .AND.、.OR.、.NEQV.、.XOR.、.EQV.、.NOT.、.GT.、.LT.、.LE.、.GE.、.NE.、.EQ.、** (累乗)。
Fortran 論理定数: .TRUE.、.FALSE.。
fpp 組込み関数の "defined": defined(name) または defined name は、マクロ名が fpp 変数として定義されている場合は .TRUE. を返します。そうでない場合は .FALSE. を返します。
#ifdef は #if defined(name) の省略で、#ifndef は #if .not. defined(name) の省略です。
定数式では、これらの演算子、整数定数、名前のみ使用できます。-D オプション、#define プリプロセッサー・ディレクティブ、またはデフォルトにより宣言されていない名前の値は 0 です。C 演算子の != (等しくない) は、#if プリプロセッサー・ディレクティブや #elif プリプロセッサー・ディレクティブで使用できますが、! がデフォルトで Fortran のコメント記号と見なされる #define プリプロセッサー・ディレクティブでは使用できません。