2009-06-10 104 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 */ 
相关问题