2014-04-06 154 views
4

它可以或可以被认为是不好的做法返回const数据成员指针从const struct?如下所示返回非const指针有什么危险?在C中返回const const成员为非const:好还是坏?

widget_t * widget_child(const widget_t * parent) 
{ 
if (!parent) 
    return NULL; 

return parent->child; 
} 
+0

这取决于您未描述的'widget_t'的语义。可以修改'const widget_t'的子元素,还是'const widget_t'是指一个不能修改它或其子元素的小部件? –

+0

更多问题是标准库中的char * strchr(const char * str,char c)'。在这里,你必须返回一个非常量指针到常量字符串中的一个位置。 C++不喜欢这样;它打破了常量正确性的概念。 –

+0

@JonathanLeffler:这就是C++用两个具有相同语义的函数替代这个函数的原因,除了保持const正确性。 – Deduplicator

回答

1

是否可以接受来自const限定的struct的特定非const数据成员完全取决于它所属的数据结构的语义。
这不是法律上的错误,C对这个问题不能再多说了。
作为程序员,您(希望)知道并理解语义的人是可信赖的(出于成功/效率)选择正确。

即使const -qualified,C刻意让你忽略它如果你确信你是正确的,并承担后果。此重写采用显式强制转换的形式。

0

这很好。指针本身就是值(毕竟它是一个地址)。您从const结构读取该值。没关系。您返回该值。这也很好。

+1

如果你像这样随心所欲地抛弃'const'',那么使用'const'有什么意义呢? – Emmet

+3

但是请注意,代码不会返回任何允许调用者修改struct'* parent'的东西。因此,这段代码尊重'* parent'的常量。没有关于'*(父 - >子)'的'const'。 – guest

+0

一个const结构体可以位于只读存储器中,并且子指针也指向一个只读存储器。扔掉const似乎是危险的。对? –

0

const关键字并没有真正定义任何常数C.它所要表达的主要是编译器一个承诺:const标识符将只读这一特定范围内进行治疗。 const应被理解为readonly,这是从C

年初坏命名这将允许编译器执行某些优化,如果怀疑被叫方被调用函数中修改这个标识符就不能这样做。

基准是:这是完全合法的,因为承诺保持不变。

相关问题