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
は引数リストが指定されなかったという意味ではなく空の引数リストを意味するため)。