转发声明typdef

时间:2016-10-12 05:51:55

标签: c++ typedef

背景

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

问题

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

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

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

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

当然,我可以在创建C ++文件之前处理这些定义:

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

但我的问题仍然存在,我可以转发声明typdef来使这项工作吗?

3 个答案:

答案 0 :(得分:1)

你不能向前声明一个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 :(得分:1)

不,typedef 不能进行前向声明。

类类型,联合类型和(从C ++ 11开始)枚举类型可以使用classstruct关键字,union关键字和{进行前向声明{1}}关键字。例如

enum

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

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

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

答案 2 :(得分:0)

可以使用typedef进行前瞻性声明。但要使用

typedef typeA typeB

typeA首先应该有前瞻声明:

struct typeA;
typedef typeA typeB