Next: Function Safety, Previous: Declare Form, Up: Functions [Contents][Index]
あるファイルをバイトコンパイルするとき、コンパイラーが知らない関数について警告が生成されるときがあります(Compiler Errorsを参照してください)。実際に問題がある場合もありますが、問題となっている関数がそのコードの実行時にロードされる他のファイルで定義されている場合が通常です。たとえば以前は、fortran.elをバイトコンパイルすると、以下のような警告が出ていました:
In end of data: fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not known to be defined.
実際のところ、gud-find-c-expr
は、Fortranモードが使用するgud-find-expr-function
のローカル値(GUDからのコールバック)の中だけで使用されていて、呼びだされた場合はGUD関数がロードされます。そのような警告が実際には問題を示さないことを知っているときには、警告を抑制したほうがよいでしょう。そうすれば、実際に問題があることを示す新しい警告の識別性が良くなります。declare-function
を使用して、これを行うことができます。
必要なのは、問題となっている関数を最初に使用する前にdeclare-function
命令を追加するだけです:
(declare-function gud-find-c-expr "gud.el" nil)
これはgud-find-c-expr
がgud.el(‘.el’は省略可)の中で定義していることを告げます。コンパイラーは関数がそのファイルで実際に定義されているとみなし、チェックを行いません。
3つ目の引数はオプションで、gud-find-c-expr
の引数リストを指定します。この例では、引数はありません(nil
と値を指定しないのは、異なります)。それ以外の場合は、(file
&optional
overwrite)
のようになります。引数リストを指定する必要はありませんが、指定すればコンパイラーはその呼び出しが宣言と合致するかチェックできます。
バイトコンパイラーにたいして、引数arglistをとるfunctionが定義されていて、その定義はfileにあるとみなすように告げます。fileonlyが非nil
の場合は、fileが存在することだけをチェックして、実際のfunctionの定義はチェックしないことを意味します。
これらの関数がdeclare-function
が告げる場所で実際に宣言されているか検証するには、check-declare-file
を使用して、1つのソースファイル中のすべてのdeclare-function
呼び出しをチェックするか、check-declare-directory
を使用して、特定のディレクトリー配下のすべてのファイルをチェックします。
これらのコマンドは、locate-library
で使用する関数の定義を含むべきファイルを探します。ファイルが見つからない場合、これらのコマンドはdeclare-function
の呼び出しを含むファイルをがあるディレクトリーからの相対ファイル名に、定義ファイル名を展開します。
‘.c’や‘.m’で終わるファイル名を指定することにより、プリミティブ関数を指定することもできます。これが有用なのは、特定のシステムだけで定義されるプリミティブを呼び出す場合だけです。ほとんどのプリミティブは常に定義されているので、それらについて警告を受け取ることはありえないはずです。
あるファイルがオプションとして外部のパッケージの関数を使う場合があります。declare-function
命令内のファイル名のプレフィクスを‘ext:’にすると、そのファイルが見つかった場合はチェックして、見つからない場合はエラーとせずにスキップします。
‘check-declare’が理解しない関数定義もいくつか存在します(たとえばdefstruct
や、その他いくつかのマクロ)。そのような場合、declare-function
のfileonly引数に、非nil
を渡すことができます。これはファイルの存在だけをチェックして、その関数の実際の定義はチェックしないことを意味します。これを行う場合、引数リストを指定する必要はないのですが、arglist引数にはt
をセットするべきだということに注意してください(なぜならnil
は、引数リストが指定されなかったという意味ではなく、空の引数リストを意味するからです)。