【问题标题】:Forward Declaration of a typedef to a Primitive Type将 typedef 前向声明到原始类型
【发布时间】:2018-01-12 11:44:12
【问题描述】:

在我的文件中说我想做的事:

typedef vector<foo> foos

如果foo 是另一个文件中的类,我可以转发声明:class foo。但是如果foo 本身就是一个原始的typedef,我不知道如何处理它。例如说在我​​已经完成的另一个文件中:

typedef int foo

我唯一的选择是#include 文件footypedef'd,还是typedef vector&lt;int&gt; foos?为了可读性和关​​联性,我宁愿避免这两个选项。还有什么我可以做的吗?

【问题讨论】:

  • 制作一个只包含 typedef 的类型标头并将它们包含在两个文件中?
  • @NathanOliver T.T 我不想在我的类型定义文件中使用#include &lt;vector&gt;。请不要让我这样做。它将被包括在任何地方。
  • 我不是这么建议的。我建议你把typedef int foo放在一个头文件中,然后把它包含在你要使用foo的文件中。
  • foo 是原始类型时,您可以将自己作为包装类,以便转发它。
  • @NathanOliver foo 真的是一个 32 位整数的 typedef,所以它几乎无处不在......你知道我们必须如何在 C++ 中做那些 typedefs 因为谁知道int 的真正含义 >:|

标签: c++ include typedef primitive forward-declaration


【解决方案1】:

编译器必须知道分配类型的大小才能构建代码。

解决方案是使用句柄的语义,例如。

它们通常是无效的*。

如果大小合适,您可以将它们转换为数字。

typedef void* foohandle;

reinterpret_cast<foohandle>(foo);

reinterpret_cast<int32_t>(foo handle);

但更好的是使用句柄作为具体类型的指针。

【讨论】:

    【解决方案2】:

    所以事实证明,您可以不止一次地在typedef 中执行相同的操作,仅在 中,而不是在 中:

    一旦声明,typedef-name 只能重新声明以再次引用相同的类型[1]

    因此,就像您将使用 class foo 转发声明 foo 一样,如果它是您也可以这样做的类型:

    typedef int foo
    

    那么你的typedef vector&lt;foo&gt; foos 就可以正常编译了。这不会违反Single Source of Truth 的原则,因为编译器将强制所有typedefs 匹配。如果您决定更改类型,但它还需要您编辑所有定义它的文件以匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2016-06-19
      • 2021-10-08
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多