2009-06-10 1 views
1

У меня есть кусок кода с помощью следующей грубой подписью:Почему я не могу назначить значение const, и что мне делать вместо этого?

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, но это может привести к появлению тонких ошибок, поскольку большая часть кода внутри цикла является макроопределением (я был укушен этим однажды). Как бы вы реструктурировали вышеупомянутое, чтобы обеспечить постоянный счетчик элементов?

ответ

5

В вашем объявлении pArray

const int const * pArray; 

Оба ключевые слова 'Const' на самом деле относятся к int. Чтобы заставить его применить к указателю, вам нужно объявить его как int const * const pArray, в котором сам указатель становится неизменным. Затем ваш компилятор должен выдать ошибку для обоих назначений.

+0

я принимаю это, так как это самый сжатый ответ. – Christoffer

0

Я понятия не имею, что там с PArray, но nElements вы можете просто использовать трехкомпонентный вместо если-то еще:

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

Если вам не нравятся триады, объявить небольшую функцию, которая вычисляет nElements , и использовать это для инициализации.

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 */ 
Смежные вопросы