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
の代替実装の制限を尊重すること。特にブーリーンのビットフィールドは、ソースファイルlib/stdbool.in.hにドキュメントされているように、bool
ではなくbool_bf
タイプであること。そうすれば標準のGCCでObjective
Cをコンパイルするときでさえ正しく機能する。
int
は可搬性に劣るので、int
よりunsigned int
かsigned
int
を優先すること。単一ビットのビットフィールドの値は0か1なのでunsigned
int
かbool_bf
を使用すること。