私はWindowsプログラムをOS Xに移植する作業を与えられました。もともとC++で書かれていましたが、私はC言語の言語で作業することはしばしばで、Objective C++ポートで。C++開発者は一般的に暗黙的なキャストをカウントしますか?
しかし、Windowsのソースコードは何か変わったことがあり、私はそれが標準的な方法かどうか疑問に思っています。 WindowsとOS Xの両方で動作しているAPIは、特定のオブジェクトメソッドがunsigned shortを渡すことを期待しています。関数がunsigned short
を返しながら、それが戻ってい変数がint
として宣言されていることを
static unsigned short hashcode (const char* value) {
int h = 0 ;
unsigned long length = strlen (value) ;
for (int i = 0 ; i < length ; i++) {
h = (31 * h) + value[i] ;
}
return h ;
}
注:元のWindowsの開発者は、この値を計算するには、次の関数を作成しました。私はドキュメントをチェックしており、OS XとWindowsは両方ともunsigned short
を2バイトと定義し、int
を4と定義しています。
データ型が考慮されない場合、この関数に渡される値はこの関数は非常に大きな数値、場合によっては十桁の数値を返します。あるアルゴリズムでは、より厳密な型の別の言語でアルゴリズムを複製した場合、2081357292912430390912
という値が得られました。コマンドラインユーティリティで上記の関数をwrapしたとき、同じ文字列が40576
の値を返しました。これは、より長い値の切り捨てられたバージョンなので、私は推測しています。
私には2つの質問があります。まず、hashcode
がunsigned short
を返すと宣言されていて、実際にそれが返ってきて、int
がコンパイラに不平を言っていないのであれば、なぜですか?最初の厳密なデータ型宣言はそうではありませんか?関数とメソッドが期待どおりのデータ型を受け取って返すことを確認するには?
第2に、この切り捨ては標準的な方法ですか?まず暗黙のキャストを利用することは私には非常に奇妙なようですが、何が起こっているのかを誰かに知らせるためのコメントはありません(私は元の開発者に依頼する必要はありません)。 「特別な」ものとしてコメントされていないので、おそらくC/C++の標準的なイディオムですか?
「自動鋳造」とは何ですか?それは矛盾ですか?あなたがキャストするか、そうしない。 –
"暗黙的なキャスト"が良い言葉ですか? 'return h'と' return(unsigned short)h'を比較しますか? – Chuck
「自動キャスト」ではなく「暗黙の変換」を意味すると思います。 C++では、キャストは明示的な変換です。 – GManNickG