方法があります
**int** create_object(Object* parent, char* name, int type, int start_block) {
...
return ptr_to_object;
}
関数の内部はptr_to_object
32ビットのようですが、関数から抜けるとすぐに64ビットのように見えます。
注:c99は使用できません。これintptr_t
は、c99の一部です。
あなたの提案は何ですか?ありがとう!
ポインターを扱う場合は、ポインター戻り型を使用するか、ポインターの保持をサポートするのに十分な大きさになるように標準で定義されているint型で「非表示」にします。このようなタイプは存在する可能性がありますが、存在することが保証されているわけではありません(tmk):
C997.20.1.4オブジェクトポインタを保持できる整数型
次の型は、voidへの有効なポインタをこの型に変換してから、voidへのポインタに戻すことができるというプロパティを持つ符号付き整数型を指定し、結果は元のポインタと同じになります。
intptr_t
次の型は、voidへの有効なポインタをこの型に変換してから、voidへのポインタに戻すことができるというプロパティを持つ符号なし整数型を指定し、結果は元のポインタと同じになります。
uintptr_t
これらのタイプはオプションです。
キーワードはオプションです。void *
選択したプラットフォームで定義されている可能性がありますが、レガシーポータビリティの場合は、型付きまたは無効なポインタに、または特殊な「ハンドル」を宣言して返す方がよいでしょう。
いつものように、私は、標準でオプションとして提示されている機能の一部(このような)を公開しないことを選択したC99準拠のプラットフォームで作業している人に完全に興味があります。<stdint.h>
なし でそれを持っている人がいる場合、intptr_t
および/またはuintptr_t
私は非常に興味があります。このようなツールチェーンを使用している場合は、コメントを残してください。
@nosが言うように、ポインタを扱っている場合は、ポインタ型を使用してください。それらを整数に変換することは移植性がなく、エラーが発生しやすくなります。
呼び出し元にそれがポインタであることを知られたくない場合は(とにかく少し掘り下げることなく)、を使用typedef
して「ハンドル」タイプなどを作成します。
typedef my_ptr* object_handle;
実際、「ハンドル」が実際には整数であっても、これを実行してください。抽象化により、呼び出し元のコードを変更することなく、後で変更することができます。