2009-06-10 126 views
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; 
} 

大多數編譯器會高興地吞下粒子陣列的分配,但扼流圈nElements的分配。這種不一致使我感到困惑,我想開悟。

我沒有問題,接受你不能分配一個常量整數,但爲什麼它的工作,因爲我期望的常量指針常量?

快速而廉價的解決方法是刪除const修飾符,但這可能會引入微妙的錯誤,因爲循環內的大部分代碼都是宏觀的(我曾經被咬過)。你將如何重組以上以允許持續的元素計數器?

回答

5

在你的pArray

const int const * pArray; 

兩個宣言 '常量' 的關鍵字實際上也適用於int。要讓一個人應用到指針,你必須聲明它爲int const * const pArray,其中指針本身變成不可變的。然後你的編譯器應該在兩個賦值上拋出一個錯誤。

+0

我會接受這一點,因爲這是最簡潔的答案。 – Christoffer 2009-06-11 07:27:01

0

我不知道這是怎麼回事與粒子陣列,但對於nElements你可以只使用一個三元代替的if-else:

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

如果你不喜歡ternaries,聲明一個小功能,計算nElements ,並用它來初始化。

9

正如米歇爾指出,你的宣言:

const int const * pArray; 

是不太正確的。

你有四(4)syntatic選擇:

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 */ 
相關問題