【问题标题】:Empty struct in C vs empty struct in C++C 中的空结构与 C++ 中的空结构
【发布时间】:2011-07-18 16:30:30
【问题描述】:

为什么 C 中的空结构违反约束?为什么这条规则在 C++ 中会发生变化?

有什么历史原因吗?

【问题讨论】:

  • @Nawaz :这是一个不同的问题。实际的问题是“为什么”而不是“什么”。
  • @Closers:伙计们,停止投票关闭 - 这根本不是重复
  • 添加了“基本原理”标签。可能有助于将其与骗子区分开来,可能不会,但我刚刚发现了这个标签。回答“因为标准是这样说的”的人经常会误解标准理由问题,所以我认为值得一试。

标签: c++ c struct rationale


【解决方案1】:

由于您在 C 中没有继承,因此您不需要它们。如果您只想拥有一个可区分的指针类型,您可以使用指向不完整类型的指针。

struct opaque;

struct opaque* stranger = 0;

应该可以正常工作。

【讨论】:

  • 我认为您是一位宏观专家。请您看看stackoverflow.com/questions/5355241/… 是否有任何改进的可能?谢谢!
  • @Johannes,我今天下午会很忙。看看 P99(通过我的博客)。或者今晚离线联系我。
【解决方案2】:

我的猜测是这样的:

在 C 中,没有继承、模板和函数重载——我们在 C++ 中使用空结构的三个主要原因——作为基接口、模板参数和帮助重载解析的类型。

你能想到 C 中空结构的任何实际用途吗?

【讨论】:

  • @Nawaz:也许,也许,我特别提到这只是一个猜测:)
  • @Nawaz:我不同意:空结构可以用作句柄这一事实并不意味着它必须这样做。 void*、int 等也是非常好的句柄。并且使用空结构与没有继承和重载的 void* 并没有真正的优势。
  • @Armen:void* 类型的句柄可以混合使用。您可以将句柄传递给接受画笔的函数,编译器不会检测到有问题。但是如果你使用空结构,那会产生编译时错误。也就是说,empty_pen*empty_brush* 的句柄不能混用。后者是类型安全的!
  • @nawaz:无论如何你都不需要它,因为你可以不定义类型。 struct pen; struct brush;.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2020-09-22
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多