【问题标题】:Forward declare typedef前向声明 typedef
【发布时间】:2016-10-12 05:51:54
【问题描述】:

背景

我正在创建与数据建模语言的 C++ 绑定。其中一部分涉及读取一组类型定义并将其转换为 C++ typdef。目前,就我而言,大约有 100 个。

问题

在我正在阅读的文件中,类型定义没有以任何方式排序。所以我最终可能会将一个类型定义为另一个尚未定义的类型。

在 C++ 中,问题基本上是这样的:

typedef typeA typeB;
typedef typeC typeA;
typedef double typeC;

所以显然这不起作用,但我可以以任何方式转发声明这些吗?

一个可能的解决方案当然是我在创建 C++ 文件之前处理这些定义:

typedef double typeC;
typedef typeC typeA;
typedef typeA typeB;

但我的问题仍然是,我可以转发声明 typdefs 以使其工作

【问题讨论】:

  • IOW,您需要按拓扑顺序对输入类型定义进行排序

标签: c++ typedef


【解决方案1】:

不,typedef 不能前向声明。

类类型、联合类型和(自 C++11 起)枚举类型可以分别使用 classstruct 关键字、union 关键字和 enum 关键字进行前向声明。例如

class Foo;  // forward declaration
Foo* make_foo();
class Foo {
   // ...
};

但是,即使您确定类型是类、联合或枚举,也不能前向声明 typedef。例如,这将不起作用:

class Bar { /* ... */ };
class Foo;
typedef Bar Foo;

原因是前向声明 Foo 隐式声明它与后面的 class Foo { /* ... */ }; 定义所定义的类型相同,因此它不同于所有先前定义的类型,所以当你稍后说 @987654329 @,你和你之前说的矛盾。

【讨论】:

  • 谢谢。我想我只需对所有的 typdef 进行排序,就可以摆脱这个问题!
【解决方案2】:

您不能转发声明 typedef,但如果有帮助,您可以为不完整的类型创建别名(我不明白到底是什么问题,但 OP 提到了他的类型没有定义的事实 - 我是授权认为它们至少已被宣布)。
也就是说,我现在会使用 using 声明而不是 typedef:

typedef A B;
// Equivalent to
using B = A;

以下是为其创建别名的前向声明(不完整)类型的示例:

struct A;
using B = A;
B* foo;
struct A {};
int main() { foo = nullptr; }

【讨论】:

  • +1 表示更喜欢using 而不是typedef... 坚持使用typedef 的唯一原因是与遗留代码的兼容性,并且您将放弃使用模板。养成using的习惯
  • 我想我明白你的意思了。但是 typedef 在定义之前没有声明(在数据建模语言文件中)。我可以像你说的那样做,但这不会比对 typedef 进行排序更简单。
【解决方案3】:

可以使用typedef 进行前向声明。但是要使用

typedef typeA typeB

typeA 应该先有前向声明:

struct typeA;
typedef typeA typeB

【讨论】:

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