7

C ++プログラムで外部Cライブラリを使用しており、ライブラリはコールバック関数を使用しています。コールバック関数はを返す必要がありvoid*ます。ライブラリは、戻り値がNULLでないかどうかをチェックします。これは、成功を意味します。

では、すべてが正常であることを伝えるための最良の方法は何ですか?

私が使う:

return reinterpret_cast<void*>(1);

しかし、それは醜いように見えます...

編集:返信ありがとう、私はこれにとどまります:

static int success;
return &success;
4

5 に答える 5

11
static int dummy;
return &dummy;

厳密に言えば、staticおそらく必須ではありませんが、スコープ外になっているローカルへのポインタを返すのは少しゴーシュな感じがします。

編集: @sharptoothのコメントに注意してください。厳密に言えば、static 必要です。

于 2013-01-23T10:52:40.523 に答える
4

使用reinterpret_castすることはあなたが得ることができるのと同じくらいきれいです。問題は、リテラルからそのようなポインターを作成intすると、未定義の動作が発生することです。標準では、nullでなく、適切に割り当てられたオブジェクトを指していないポインターの使用が禁止されています。標準に準拠する方法は、いくつかの変数(おそらくファイルスコープ変数が最も便利です)を持ち、そのアドレスを返すことです。

于 2013-01-23T10:50:56.877 に答える
3

私はおそらく次のようなものを書くでしょう:

return const_cast<void*>(""); // non-null pointer, referand doesn't matter

おそらく、コールバック関数には、nullでないことが保証されたポインター入力があります。もしそうなら、あなたはそれを返すことができます。

reinterpret_cast<void*>(1)動作が保証されていないため、見た目は醜いはずです。ほとんどのアーキテクチャはそれを気にしませんが、

  • この標準は、オブジェクトのアドレス(またはnullポインター、または配列の1回限り)ではないポインター値を使用できることを実際に保証するものではありません。
  • 標準はreinterpret_cast<void*>(1)、それがnullポインターではなく、実装定義であることを保証しません。

関数が誤ってnullを返す実装があるとは思えませんが、それは可能です。CPU自体のアドレス指定が8ビットではなく4ビットである架空の実装を想像してみてください。もちろん、実装者は引き続きを選択CHAR_BIT == 8し、C++のすべてのポインターは8ビットで整列されます。次に、実装は、ビットパターンを変更せずにポインタから整数に、最後のビットをゼロにすることで整数からポインタに合法かつかなり合理的にマッピングできます。または、1ビット右シフトおよび左シフトすることもできます。標準では、ポインタ->整数->ポインタが元の値を復元する必要がありますが、整数->ポインタ->整数が復元する必要はありません。

于 2013-01-23T11:15:43.913 に答える
2

どうですか

return this;

NULL以外であることが保証されている有効なポインタを返す簡単な方法として?

于 2013-01-23T10:51:00.877 に答える
1

それが私なら、私は使用します:

return (void*)1;

シンプルで美しい。

他の値は何らかの方法で解釈される可能性があるため(これは良くありません)、他の値よりも値1(問題で使用した)の方が好きです。ゼロ以外の値(null以外のポインター)を返すだけの場合は、特別なものを抽出できない値を使用することをお勧めします。

于 2013-01-23T11:13:14.897 に答える