我有以下粗糙签名的一段代码:

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整数,但后来为什么它的作品,因为我想到了常量指针给const?

在快速和廉价的解决方法是删除const修饰,但可能引进因为大部分循环内的代码是macrofied(我已经通过咬伤一次)微妙的错误。你将如何重组上述允许常量元素计数器?

有帮助吗?

解决方案

在您的pArray的声明

const int const * pArray;

两个 'const的' 关键字实际上也适用于int。为了得到一个适用于指针,你必须将其声明为int const * const pArray,其中指针本身成为不可改变的。那么你的编译器应该扔在这两个任务的错误。

其他提示

正如米歇尔指出的,你的声明:

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 */

我不知道这是怎么回事与粒子阵列,但对于nElements你可以只使用一个三元代替的if-else:

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

如果你不喜欢ternaries,声明一点函数计算nElements,并用它来初始化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top