4.6 詳細
4.6.1 マクロ、変数定義のスコープ
定義のスコープはその定義が置かれている行から始まり、現行ファイルの終端まで続き ます(#includeされたファイルからのソース行もすべて含みます)。しかし次のものに対しては影響しません:
- FortranのINCLUDE行によって取り込まれたファイル
- fpp及びFortranコメント
- IMPLICITの一文字指定
- FORMAT文
- 数値、文字定数
マクロの影響範囲については#undef指示文によって制限を加えることができます。
次はマクロ定義を複数行に分けた例です:
この指示文の後では‘name’はfppによってマクロ名や変数名とは解釈され
なくなります。
‘name’がマクロ名でなかった場合にはこの指示文は何の効果も持ちません。
Condition は以下に規定する定数式です。
対応する最初の#elif, #else、または#endif指示文に至る後続
行は、condition が真である場合に限り出力中に現れます。
#elif指示文に続く行は次の場合に限り出力中に現れます。
条件が真の場合、後続の対応する#elif, #else指示文は対応する
#endifに至るまですべて無視されます。
#else指示文に続く行は、該当条件文中におけるそれ以前の条件がすべて偽の
場合に限り出力中に現れます。
定数式中でマクロ関数‘defined’を使用することができます。それは引数が
定義されたマクロ名であった場合に限り真となります。
以下の演算が許されます。
#include "filename"の場合:
defined(name) または defined name
4.6.2
マクロ定義の終端
マクロ定義の長さは任意ですが論理的な行で言うと1行に限られます。
これらは複数の物理的な行に分かれていても構いませんが、その際、最後の行以外には
継続行があることを示す‘\’(バックスラッシュ)を配置します。
バックスラッシュとニューラインの記号は置換テキストの対象となりません。
バックスラッシュを置かずにニューラインが現れた場合にはマクロ定義は終結したもの
とみなされます。
#define long_macro_name(x,\
y) x*y
4.6.3
関数形式マクロ定義
マクロコールの引数の数は対応するマクロ定義内の引数の数に等しくなくてはなりませ
ん。
引数の数が誤って使用された場合にはエラーとなります。
4.6.4
マクロ定義のキャンセル
#undef name
4.6.5
条件付きソースコード選択
#if condition
定数式中ではこれらの項と整定数表現、名前のみが使用できます。
マクロ名でない名前は‘0’であるかのように扱われます。
C演算‘!=’(not equal)は#ifまたは#elif指示文中
で使用できますが、#define指示文中では使用できません。文字
‘!’がFortranコメントの開始を意味するものと解釈されてしまうか
らです。
4.6.6
外部ファイルの取込み
ファイルは次のようにサーチされます。
#include <filename>の場合:
Fpp指示文(#文字で始まる行)はソースコードの任意の位置、特に
Fortran継続行の直前にも置くことができます。
ただし継続記号によって複数行に分けられたマクロコール中に配置すること
は許されません。
4.6.7
コメント
Fppに対しては次の2種類のコメントが使用できます:
4.6.8
マクロ関数
マクロ関数
