1

次の大まかな署名を持つコードがあります。

void evaluate(object * this)
{
    static const int briefList[] = { CONSTANT_A, CONSTANT_Z };
    static const int fullList[] = { CONSTANT_A, CONSTANT_B, ..., CONSTANT_Z};

    const int const * pArray;
    const int nElements;
    int i;

    if ( this->needDeepsEvaluation ) 
    {
        pArray = fullList;
        nElements = sizeof(fullList) / sizeof(fullList[0]);
    }
    else
    {
        pArray = briefList;
        nElements = sizeof(briefList) / sizeof(briefList[0]);
    }

    for ( i = nElements; i; i-- )
    {
         /* A thousand lines of optimized code */
    }
    this->needsDeepEvaluation = 0;
}

ほとんどのコンパイラは、pArray の代入を喜んで飲み込みますが、nElements の代入では窒息します。この矛盾は私を混乱させます、そして私は悟りたいです。

const 整数を割り当てることができないことを受け入れるのに問題はありませんが、const-pointer-to-const に対して期待どおりに機能するのはなぜですか?

迅速かつ安価な修正は、const 修飾子を削除することですが、ループ内のコードの多くがマクロ化されているため、微妙なバグが発生する可能性があります (私は一度それに噛まれました)。上記をどのように再構成して、一定の要素カウンターを許可しますか?

4

3 に答える 3

9

ミシェルが指摘したように、あなたの宣言は:

const int const * pArray;

完全に正しくありません。

4つの構文上の選択肢があります。

int * pArray;        /* The pointer and the dereferenced data are modifiable */
int * const pArray;  /* The pointer is constant (it should be initialized),
                        the dereferenced data is modifiable */
int const * pArray;  /* the pointer is modifiable, the dereferenced data 
                        is constant */
int const * const pArray; /* Everything is constant */
于 2009-06-10T16:01:20.410 に答える
5

あなたの宣言ではpArray

const int const * pArray;

両方の「const」キーワードが実際に適用されintます。ポインターに適用するものを取得するにはint const * const pArray、ポインター自体が不変になるように宣言する必要があります。コンパイラは、両方の割り当てでエラーをスローする必要があります。

于 2009-06-10T13:22:23.493 に答える
0

pArray がどうなっているのかわかりませんが、nElements の場合は、if-else の代わりに 3 項を使用できます。

const int nElements = this->needsDeepEvaluation ? sizeof(fullList) / sizeof(fullList[0]) | sizeof(briefList) / sizeof(briefList[0]);

三項が気に入らない場合は、nElements を計算する小さな関数を宣言し、それを使用して初期化します。

于 2009-06-10T13:21:41.357 に答える