【发布时间】:2018-01-14 20:57:01
【问题描述】:
假设我有一个局部变量int var;,用于通过调用另一个函数来检索一些值,例如:func(..., &var);。
然后我检查某些事物的检索值并采取相应的行动。在变量var 接收到它的值之后,var 将从此不再改变。
那么将var 定义为const 是否有意义? (int const var;)。
我不确定这是否是使用 const 关键字的正确方法,因为 var 的初始值是从堆栈中遗留下来的,并且在调用 func 时会发生变化:@ 987654329@。因此,在某些方面与 const 类型限定符相矛盾。
我对此不确定的原因是因为将变量 var 定义为 const (int const var;) 的效果(或结果)是后面代码的期望行为在var 的范围内。
即,不应允许使用赋值运算符直接更改 var 的值,即使 var 的值刚刚被 func 函数中的某个指针更改。
示例
int foo(void)
{
int const var;
if (!func(..., &var))
return 0;
if (var == x)
// do some stuff
else if (var == y)
// do some other stuff
else
// nope
return var * x + y;
}
我想知道在正确性方面,用于定义var 的 const 类型限定符是否仍然适用于这种情况。
关于正确性,至少使用 gcc 你可以传递你的 const var 到修改功能,但它会产生警告。我也不会 推荐也不做。这无助于混淆读者。
我似乎因为误解了 MSVC 的结果行为而走错了路。在启用/Wall 时,MSVC 产生的唯一警告是const object should be initialized。我没想太多,因为只需初始化var,看看会发生什么,结果是一个干净的编译。
但我想我至少对正在发生的事情有所了解。如果你有一个 const 数据类型,编译器认为你不应该写入只读的东西,即使使用指针这样做也是如此。因此,编译器唯一能看到传递给函数的 const 变量的地址是在该变量包含垃圾值以外的任何内容时。因此出现初始化警告。
如果在您的示例中使用 var 进行相等比较,则使其 const 可以避免 if (var = ...) 与 if (var == ...) 错字,因为 编译器会捕捉到这一点。
关于在尝试捕获此错误时是否使用 const;我认为它更多地与确保编译器根据标准中定义的规则吐出一些东西有关,而不是与编译器在省略 const 时产生或不产生警告有关var的定义。
【问题讨论】:
-
请注意,在 C 中,
const是 只读 的误称。const限定对象允许更改(但您不能分配给它们)。 -
但是,将(可能是使用指针)写入只读字段/变量仍然感觉非常违反直觉。
-
我仍然不确定您要问的是什么。你不能用一句话来表达你的问题,比如:“下面的代码是否正常”?
-
我添加了示例代码来说明我认为你想要什么,希望能澄清这个问题。如果不正确,请编辑它和/或您的问题。