Previous: オブジェクトの内部, Up: GNU Emacsの内部 [Contents][Index]
以下はEmacsのCソースコード内で整数タイプを使用する際のガイドラインです。これらのガイドラインはときに相反するアドバイスを与えることがありますが一般的な常識に沿ったものがアドバイスです。
sの長さをintの範囲に収めることが要求されるのでなければint len =
strlen (s);を使用しないこと。
ptrdiff_tのかわりにsize_t、intptr_tのかわりにuintptr_t)にたいして同様のアドバイスを適用できる。
intを優先すること。より一般的には、たとえばスクリーン列数のようにint範囲と既知である整数にはintを優先すること。
ptrdiff_tを優先すること。これは符号付きタイプにたいするEmacsの一般的な優先事項である。ptrdiff_tの使用によりオブジェクトはPTRDIFF_MAXに制限されるが、より大きいオブジェクトはポインター減算を破壊するかもしれず結局のところ問題を起こす可能性があるので、これは一方的に制限を課すものではない。
ssize_t関連の制限をもつ低レベルAPIト対話する際を除いてssize_tを避けること。これは典型的なプラトフォームではptrdiff_tと等価だとしても、ssize_tは範囲が狭いときがあり使用によりサイズ関連の計算がオーバーフローするかもしれない。同じくptrdiff_tはより一般的で標準化されており、標準的なprintfフォーマットをもち、Emacsの内部的なサイズオーバーフローのチェックの基礎である。ssize_tを使用する際にはPOSIXガ-からSSIZE_MAXの範囲の値にたいするサポートだけを要求することに注意してほしい。
intptr_tを優先すること。しかしページ境界を横切る可能性のあるポインター演算を表す場合にはuintptr_tを優先すること。たとえば32ビットのアドレス空間をもつマシンでの配列は0x7fffffff/0x80000000境界を横断する可能性があり、(intptr_t)
0x7fffffffに1を加算することによって整数のオーバーフローが発生し得る。
EMACS_INTにもとづくのでEmacsで定義されたタイプEMACS_INTを優先すること。
off_tやtime_t等の)システムタイプを優先すること。安全だと解っていなければシステムタイプが符号付きだと仮定してはならない。たとえばoff_tは常に符号付きだがtime_tは符号付きである必要はない。
intmax_tを優先すること。printf族の関数は"%"PRIdMAXのようなフォーマットを使用してこのような値をプリントできる。
bool、false、trueを使用すること。boolの使用によりプログラムの可読性が増して、intを使用するより若干高速になる。int、0、1を使用しても大丈夫だが旧スタイルは段階的に廃止される。boolを使用する際にはboolの代替実装の制限を尊重すること。特にブーリーンのビットフィールドは、boolではなくbool_bfタイプであること。そうすれば標準のGCCでObjective
Cをコンパイルするときでさえ正しく機能する。
intは可搬性に劣るので、intよりunsigned intかsigned
intを優先すること。単一ビットのビットフィールドの値は0か1なのでunsigned
intかbool_bfを使用すること。