它可以或可以被认为是不好的做法返回const
数据成员指针从const struct
?如下所示返回非const
指针有什么危险?在C中返回const const成员为非const:好还是坏?
widget_t * widget_child(const widget_t * parent)
{
if (!parent)
return NULL;
return parent->child;
}
它可以或可以被认为是不好的做法返回const
数据成员指针从const struct
?如下所示返回非const
指针有什么危险?在C中返回const const成员为非const:好还是坏?
widget_t * widget_child(const widget_t * parent)
{
if (!parent)
return NULL;
return parent->child;
}
是否可以接受来自const
限定的struct
的特定非const
数据成员完全取决于它所属的数据结构的语义。
这不是法律上的错误,C对这个问题不能再多说了。
作为程序员,您(希望)知道并理解语义的人是可信赖的(出于成功/效率)选择正确。
即使为const
-qualified,C刻意让你忽略它如果你确信你是正确的,并承担后果。此重写采用显式强制转换的形式。
的const
关键字并没有真正定义任何常数C.它所要表达的主要是编译器一个承诺:const
标识符将只读这一特定范围内进行治疗。 const
应被理解为readonly
,这是从C
年初坏命名这将允许编译器执行某些优化,如果怀疑被叫方被调用函数中修改这个标识符就不能这样做。
基准是:这是完全合法的,因为承诺保持不变。
这取决于您未描述的'widget_t'的语义。可以修改'const widget_t'的子元素,还是'const widget_t'是指一个不能修改它或其子元素的小部件? –
更多问题是标准库中的char * strchr(const char * str,char c)'。在这里,你必须返回一个非常量指针到常量字符串中的一个位置。 C++不喜欢这样;它打破了常量正确性的概念。 –
@JonathanLeffler:这就是C++用两个具有相同语义的函数替代这个函数的原因,除了保持const正确性。 – Deduplicator