【问题标题】:Return const struct member as non const in C: ok or bad?在 C 中将 const struct 成员作为非 const 返回:好还是坏?
【发布时间】:2014-05-18 07:25:51
【问题描述】:

const struct 返回非const 数据成员指针可以吗?如下图返回非const指针有什么危害?

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

return parent->child;
}

【问题讨论】:

  • 这取决于 widget_t 的语义,您尚未描述。是否可以修改 const widget_t 的子代,还是应该 const widget_t 表示您无法修改它或其任何后代的小部件?
  • 更成问题的是来自标准库的char *strchr(const char *str, char c)。在这里,您必须返回一个指向常量字符串中某个位置的非常量指针。 C++ 不喜欢这样;它打破了 const 正确性的概念。
  • @JonathanLeffler:这就是 C++ 用两个除了保持 const 正确性之外具有相同语义的函数替换这个函数的原因。

标签: c pointers struct constants


【解决方案1】:

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

【讨论】:

  • 如果你这样一时兴起就扔掉const-ness,那么使用const又有什么意义呢?
  • 请注意,代码不会返回任何允许调用者修改结构*parent 的内容。因此,此代码尊重*parent 的常量。 const*(parent->child) 无关。
  • 一个 const 结构可以在只读内存中,并且子指针也指向只读内存。丢弃 const 似乎很危险。对吗?
  • @emmet 和客人:问题是 widget_t::child 是指向 widget_t 的指针还是指向 const widget_t 的指针。
  • 是的,你是对的。如果parent->child 指向可变的东西,那么它可能没有任何问题。问题是const-ness 是否会或应该被考虑传播给孩子。从技术上讲,我很确定它不会。从哲学上讲,我不确定它不应该。
【解决方案2】:

是否可以从const-qualified struct 返回特定的非const 数据成员完全取决于它所属的数据结构的语义。
这在法律上并没有错,C 对此不能再多说什么。
作为程序员,你(希望)知道并理解语义是值得信任的(出于必要性/为了效率)选择正确的。

即使它 const-qualified,C 故意允许你覆盖它如果你确定你是对的并接受后果。这个覆盖需要显式强制转换的形式。

【讨论】:

    【解决方案3】:

    const 关键字并没有真正定义 C 中的任何常量。它所说的基本上是对编译器的承诺:const 标识符在此特定上下文中将被视为只读。 const 应该读作readonly,这是从 C 开始的错误命名。

    这将允许编译器进行某些优化,如果它怀疑被调用者在被调用函数中修改此标识符,则它无法做到。

    基线是:这是完全合法的,因为承诺得到遵守。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多