0

方法があります

**int** create_object(Object* parent, char* name, int type, int start_block) {
  ...
  return ptr_to_object;
}

関数の内部はptr_to_object32ビットのようですが、関数から抜けるとすぐに64ビットのように見えます。

注:c99は使用できません。これintptr_tは、c99の一部です。

あなたの提案は何ですか?ありがとう!

4

2 に答える 2

1

ポインターを扱う場合は、ポインター戻り型を使用するか、ポインターの保持をサポートするのに十分な大きさになるように標準で定義されているint型で「非表示」にします。このようなタイプは存在する可能性がありますが、存在することが保証されているわけではありません(tmk):

C997.20.1.4オブジェクトポインタを保持できる整数型

  1. 次の型は、voidへの有効なポインタをこの型に変換してから、voidへのポインタに戻すことができるというプロパティを持つ符号付き整数型を指定し、結果は元のポインタと同じになります。

    intptr_t

    次の型は、voidへの有効なポインタをこの型に変換してから、voidへのポインタに戻すことができるというプロパティを持つ符号なし整数型を指定し、結果は元のポインタと同じになります。

    uintptr_t

    これらのタイプはオプションです

キーワードはオプションですvoid *選択したプラットフォームで定義されている可能性がありますが、レガシーポータビリティの場合は、型付きまたは無効なポインタに、または特殊な「ハンドル」を宣言して返す方がよいでしょう。

いつものように、私は、標準でオプションとして提示されている機能の一部(このような)を公開しないことを選択したC99準拠のプラットフォームで作業している人に完全に興味があります。<stdint.h> なし でそれを持っている人がいる場合、intptr_tおよび/またはuintptr_t私は非常に興味があります。このようなツールチェーンを使用している場合は、コメントを残してください。

于 2012-11-30T20:26:36.110 に答える
0

@nosが言うように、ポインタを扱っている場合は、ポインタ型を使用してください。それらを整数に変換することは移植性がなく、エラーが発生しやすくなります。

呼び出し元にそれがポインタであることを知られたくない場合は(とにかく少し掘り下げることなく)、を使用typedefして「ハンドル」タイプなどを作成します。

typedef my_ptr* object_handle;

実際、「ハンドル」が実際には整数であっても、これを実行してください。抽象化により、呼び出し元のコードを変更することなく、後で変更することができます。

于 2012-11-30T13:54:07.673 に答える