5.4 出力コードの詳細を調整するオプション

これらのオプションの多くは、入力ファイルの宣言としても指定できます(4.1.1.2 Gperfの宣言を参照)。

‘-K slot-name’
‘--slot-name=slot-name’
このオプションが役立つのは、‘-t’オプション、または同じ働きをする‘%struct-type’宣言を指定した場合だけです。デフォルトでは、キーワードを格納する構造体メンバーの識別子を‘name’とみなします。このオプションで、そのメンバーの識別子を任意に選べます。ただし、指定したstructの最初のフィールドでなければならない点は変わりません。
‘-F initializers’
‘--initializer-suffix=initializers’
このオプションが役立つのは、‘-t’オプション、または同じ働きをする‘%struct-type’宣言を指定した場合だけです。空のハッシュテーブル項目で、slot-nameより後にある構造体メンバーの初期化子を指定できます。初期化子の一覧はカンマで始める必要があります。デフォルトでは、出力コードはslot-nameより後の構造体メンバーをゼロで初期化します。
‘-H hash-function-name’
‘--hash-function-name=hash-function-name’
生成するハッシュ関数の名前を指定できます。デフォルトの名前は‘hash’です。このオプションにより、同じファイル内で2つのハッシュテーブルを使えます。
‘-N lookup-function-name’
‘--lookup-function-name=lookup-function-name’
生成する検索関数の名前を指定できます。デフォルトの名前は‘in_word_set’です。このオプションにより、生成した複数のハッシュ関数を同じアプリケーションで使えます。
‘-Z class-name’
‘--class-name=class-name’
このオプションが役立つのは、‘-L C++’オプション、または同じ働きをする‘%language=C++’宣言を指定した場合だけです。生成するC++クラスの名前を指定できます。デフォルトの名前はPerfect_Hashです。
‘-7’
‘--seven-bit’
生成するハッシュ関数と検索関数に引数として渡す文字列がすべて、7ビットASCII文字(0..127の範囲のバイト)だけで構成されることを指定します。ANSI Cのisalnum関数やisgraph関数は、バイトがこの範囲内にあることを保証しません。これを保証するのは、‘c >= 'A' && c <= 'Z'’のような明示的な検査だけです。これは2.7より前のgperfのデフォルトでしたが、現在は8ビット文字とマルチバイト文字のサポートがデフォルトです。
‘-l’
‘--compare-lengths’
文字列の比較を試みる前に、キーワードの長さを比較します。このオプションはバイナリ比較には必須です(4.3 NULバイトの使用を参照)。長さの異なるキーワードをstrcmpで比較しなくなるため、検索時の文字列比較の回数を減らせる場合もあります。ただし、検索テーブルの範囲が大きい場合、つまりswitchオプションの‘-S’または‘%switch’が有効でない場合は、‘-l’を使うと生成するCコードのサイズが大幅に増える可能性があります。長さのテーブルが、検索テーブルの項目数と同じ数の要素を持つためです。
‘-c’
‘--compare-strncmp’
文字列比較にstrncmp関数を使うCコードを生成します。デフォルトではstrcmpを使います。
‘-C’
‘--readonly-tables’
生成するすべての検索テーブルの内容を定数、つまり「読み取り専用」にします。多くのコンパイラでは、テーブルを読み取り専用メモリに置くことで、より効率のよいコードを生成できます。
‘-E’
‘--enum’
#defineの代わりに、検索関数内のローカルなenumを使って定数値を定義します。これにより、異なる検索関数を同じファイル内に置くこともできます。James Clark <jjc@ai.mit.edu>に感謝します。
‘-I’
‘--includes’
コードの先頭に、必要なシステムのインクルードファイル<string.h>を含めます。デフォルトでは含めないため、コードをコンパイルできるように、利用者自身がこのヘッダーファイルをインクルードする必要があります。
‘-G’
‘--global-table’
キーワードの静的テーブルを、検索関数の中に隠すデフォルトの動作ではなく、静的なグローバル変数として生成します。
‘-P’
‘--pic’
生成するテーブルを、共有ライブラリに組み込むために最適化します。生成コードを含む共有ライブラリを使うプログラムの起動時間を短縮します。‘-t’オプション、または同じ働きをする‘%struct-type’宣言も指定した場合、利用者が定義するstructの最初のフィールドの型は、‘char *’ではなく‘int’でなければなりません。実際の文字列ではなく、文字列プール内のオフセットを格納するためです。そのオフセットを文字列に変換するには、‘stringpool + o’という式を使えます。oはオフセットです。文字列プールの名前は、‘--string-pool-name’オプションで変更できます。
‘-Q string-pool-name’
‘--string-pool-name=string-pool-name’
‘-P’オプションによって作る文字列プールの名前を指定できます。デフォルトの名前は‘stringpool’です。このオプションにより、‘-P’を使う場合に同じファイル内で2つのハッシュテーブルを使えます。‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも使えます。
‘--null-strings’
空のキーワードテーブル項目に、空文字列の代わりにNULL文字列を使います。実行時に検査と分岐の命令が1つ増えますが、生成コードを含む共有ライブラリを使うプログラムの起動時間を短縮します。ただし、‘-P’オプションほどの効果はありません。
‘--constants-prefix=prefix’
TOTAL_KEYWORDS、MIN_WORD_LENGTH、MAX_WORD_LENGTHなどの定数に付ける接頭辞を指定できます。このオプションにより、‘-E’オプション、または同じ働きをする‘%enum’宣言を指定しない場合や、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つのハッシュテーブルを使えます。
‘-W hash-table-array-name’
‘--word-array-name=hash-table-array-name’
ハッシュテーブルを格納する生成配列の名前を指定できます。デフォルトの名前は‘wordlist’です。このオプションにより、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つのハッシュテーブルを使えます。
‘--length-table-name=length-table-array-name’
長さのテーブルを格納する生成配列の名前を指定できます。デフォルトの名前は‘lengthtable’です。このオプションにより、‘-G’オプション、または同じ働きをする‘%global-table’宣言を指定した場合でも、同じファイル内で2つの長さのテーブルを使えます。
‘-S total-switch-statements’
‘--switch=total-switch-statements’
生成するCコードで、配列の検索テーブルの代わりにswitch文方式を使います。入力ファイルによっては、必要な実行時間と記憶領域の両方を減らせます。このオプションの引数は、生成するswitch文の数を指定します。値が1なら全要素を含む1つのswitchを生成し、値が2なら各switchに要素の半分ずつを含む2つのテーブルを生成します。ほかの値でも同様です。多くのCコンパイラは、大きなswitch文のコードを正しく生成できないため、この指定が役立ちます。このオプションは、Keith Bosticによる元のCプログラムからも着想を得ました。
‘-T’
‘--omit-struct-type’
型の宣言を出力ファイルへ転送しないようにします。型がすでにほかの場所で定義されている場合に使ってください。
‘-p’
このオプションは、以前のgperfリリースとの互換性のためにサポートされています。何も行いません。