2

私は API を設計していますが、その重要な部分は、多くの const メンバーを持つ API によって返される構造体です。また、const ポインターと const 変数へのポインターの両方があります。実装内で、この構造体を変更する必要があります。現在、まったく同じ構造体を定義していますが、const キーワードを削除し、名前を変更しています。API 呼び出しの中で、外部構造体を内部構造体にキャストするだけです。

より良い方法でコーディングする方法はありますか? 現在の設計では、一方の構造体を変更して他方を忘れると、エラーが発生しやすくなります。

4

3 に答える 3

5

不透明な構造体とアクセサー関数を使用する

不透明な構造体は API の名前を提供しますが、フィールドに対処する方法はありません。

API のアクセサ関数は、好きなように制御されたアクセスを提供します。

于 2012-12-26T22:52:40.540 に答える
0

ここで注意してください: これらのフィールドは実際には書き込み不可ではありません。
それらをちょっと「プライベート」にしたいのですが、すべてのプログラマーは次の方法でそれらにアクセスできます。

typedef struct
{
    const int x;
}mystruct;

それで:

mystruct ms= {0};
*((int*)&(ms.x)) =4;
printf("%d",ms.x);

const 指定子は、プログラマーがコンパイル時にそれらを変更できないようにするためです。ただし、実行時には、メモリは読み取り専用ではありません。

私はまだ、const 指定子が便利だと思っています。優れたプログラマーがそれを見て、そのフィールドにアクセスするべきではないと言います。
したがって、これらの const フィールドを変更できると確信している場合は、あなたの場所でこの方法を使用します。知識のあるプログラマーが気に入らないことはわかっています。私も好きではありませんが、これをバイパスする必要がある場合があります。

于 2012-12-26T23:26:40.187 に答える
-1

複製はすべての悪の根源であるため、構造定義を複製する代わりに、次のようなことができます。

#ifndef CONST
#define CONST const
#endif

struct mystruct
{
    CONST void * my_data;
};

CONSTこれで、プライベート実装にヘッダー ファイルを含める前に、空であることを定義するだけです。

ただし、他の回答が示唆するように、これはあまり良い考えではありません。まず、あなたが望むものを達成するためのより良い、よりクリーンな方法がおそらくあります。次に、コンパイラがフィールドの constness を使用してコードを最適化する可能性があるため、これは奇妙で望ましくない結果につながる可能性があります。

要するに、API を再考したほうがよいと思います。

于 2012-12-26T22:54:47.243 に答える