【发布时间】:2016-05-04 19:15:27
【问题描述】:
我试图了解“const”在 C 中的工作原理。
我想要创建的是一个polygon struct,它的成员不能被改变。
我从创建以下结构开始
struct vector2{
float x;
float y;
};
struct polygon2{
const size_t count;
struct vector2* const points;
};
为了创建一个多边形,我创建了以下函数:
struct polygon2* polygon2_create(size_t count)
{
struct vector2* points = calloc(count, sizeof *points);
struct polygon2 temp = {.count = count,
.points = points};
struct polygon2* actual = malloc(sizeof *actual);
memcpy(actual, &temp, sizeof(*actual));
return actual;
}
I believe this function doesn't cause undefined behavior.
这样我可以做类似的事情
struct polygon2* poly = polygon2_create(30);
poly->points[3] = (struct vector2){7.1, 5.3};
但我做不到
poly->points = NULL;
也没有
poly->count = 3;
这很棒。我确定不会不小心更改struct polygon的内容。
但我也想让vector2 的成员成为常量。
如果我将vector2 更改为:
struct vector2{
const float x;
const float y;
};
我不能再这样做了:
poly->points[3] = (struct vector2){7.1, 5.3};
我想知道为什么。我预计将vector2的成员设为const我将无法做到这一点
poly->points[3].x = 3
但我仍然可以这样做
poly->points = otherpoint;
有人可以解释我缺少什么吗?以及如何实现以下目标:
- 创建一个“不可变”
vector2 struct - 创建一个
polygon struct,其points或count成员无法更改,但points指向的内容可以“交换”。
【问题讨论】:
-
const 代表常量值。a.k.a 一个不能改变其值的变量的值。例如:
const int x=1;x=2;会报错。在我的 gcc 版本中,错误将是assignment of read-only variable x。 -
你不能使动态分配的结构不可变,因为你必须在分配后修改它以分配初始值。
-
@Mike:这是错误的! C 没有符号常量,除了 enum-constants。
const限定对象仍然是变量,但程序员保证不会更改它们,即值 将 不会更改。如果程序员违反此合同,它可以改变,从而导致未定义的行为。编译器的诊断是一种礼貌,但不能保证,例如如果您抛弃const或使用指针(在某些情况下,即使没有强制转换,编译器也不会检测到这种情况)。