我有一个变量,它是链接列表的头部。我想把它变成const因为它永远不应该改变,变量在整个程序中使用,所以我认为我应该把它变成一个全局const。问题是我在声明const之后无法初始化它。
如何解决这个问题?
typedef struct PT {
int x;
int y;
struct PT *next;
} POINT;
//globals
POINT * const mypoint_head;
int main(int argc, char *argv[])
{
int size = 100;
mypoint_head= InitPoint(size); // error C2166: l-value specifies const object
//rest of code
}
POINT* InitPoint(int size)
{
POINT *tmp;
POINT *orig;
int a = 10;
int b = 1000;
orig = (POINT*) malloc (sizeof(POINT) * size);
if(orig == NULL)
return NULL;
tmp = orig;
for (i = 0; i < size; i++)
{
tmp->x = a++;
tmp->y = b++;
if (i == size -1) {
tmp->next = NULL:
}
else {
tmp->next = tmp+1;
}
tmp++;
}
return orig;
}
答案 0 :(得分:4)
你不能 - 这就是const
的全部内容。
答案 1 :(得分:2)
你是正确的,因为永远不能改变声明const
的变量。不幸的是,您的mypoint_head= InitPoint(size);
行计为尝试更改变量。您必须在声明它时使用值初始化const
变量。
尝试这样的事情:
//globals
static POINT head_of_list;
POINT* const mypoint_head = &head_of_list;
现在,您可以使用以下命令初始化列表:
mypoint_head->next= InitPoint(size-1);
列表头对象是静态声明的,因此它始终存在,您需要适当调整InitPoint
参数。您还可以对另一个文件中的指针进行extern
引用,而无需将其指向的对象直接访问(为了它的价值)。
答案 2 :(得分:2)
还没人建议:
int main(int argc, char *argv[])
{
int size = 100;
// cast address of mypoint_head to a non-const pointer:
POINT ** nc_pmh = (POINT **)&mypoint_head;
// use the address to set mypoint_head:
(*nc_pmh) = InitPoint(size);
//rest of code
}
这可能不适用于C ++,它可能无法为const对象提供空间。
顺便说一句:这通常不是好习惯。然而,在这种情况下,它运作良好。顺便说一句:你要检查InitPoint()
的回报,并采取相应的行动(可能会调用exit())。
答案 3 :(得分:1)
从全局声明中删除const限定符,并将rest_of_code声明为一个采用const限定版本指针的函数。
//globals
POINT * mypoint_head;
void rest_of_code(POINT* const mypoint_head)
{
mypoint_head = NULL; // this errors out now
}
int main(int argc, char *argv[])
{
int size = 100;
mypoint_head= InitPoint(size); // no longer errors out
//rest of code
rest_of_code(mypoint_head);
}
答案 4 :(得分:1)
没有全局const指针作为其他所有内容的接口。
使用功能: -
static POINT * mypoint_head;
POINT* point_head()
{
return mypoint_head;
}
答案 5 :(得分:0)
您必须在声明中使用初始化程序:
static POINT mypoint_data[100];
POINT * const mypoint_head = &mypoint_head;
然后更改您的InitPoint函数以获取指向数据空间的指针,而不是调用malloc
并将其传递给mypoint_data
您还可以将extern POINT * const mypoint_head;
粘贴到头文件中,以便可以在其他编译单元中访问。
答案 6 :(得分:0)
(假设c)const必须在声明时初始化,并且无法对它们进行求值。也许您可以使用const指针并使其指向您的头部并将其暴露给其余代码。 如果我必须实现,我可能会通过getListHead()函数公开变量并给它一些不起眼的名字:)
想知道用例是什么。即使它的头指针改变,我也会使我的列表工作。 (如果我有一个常量头,如果我必须删除头节点,我将不得不像数组一样移动元素)
答案 7 :(得分:0)
我无法相信没有人建议使用const_cast ..它对于常量指针也同样好。
const_cast<POINTER *>(mypoint_head) = InitPoint(size);
简单,没有额外的变量声明,没有。