2016-10-12 79 views
2

背景正向声明typdef

我创造一个C++绑定到数据建模语言工作。其中一部分涉及读取一组类型定义并将其转换为C++ typdefs。目前,在我的情况下,大约有100个。

问题

在该文件中,我读的类型定义是不以任何方式进行排序。所以我最终可能会将类型定义为另一个尚未定义的类型。

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

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

所以,很显然这是不行的,但我可以向前以任何方式声明这些?

一种可能的解决方法当然是由我来创建C++文件之前处理这些定义:

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

但我的问题仍然是,可我向前声明typdefs,使这项工作

+0

督察,你需要你的输入类型定义在拓扑顺序 – Rerito

回答

1

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

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

下面是其一个别名被创建的正向声明(不完全)类型的示例:

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

+1宁愿'using'了'typedef'排序。 ..坚持'typedef'的唯一原因是与旧代码的兼容性,并且你会放弃使用模板。养成“使用”的习惯 – qxz

+0

我想我理解你的观点。但是typedef在定义之前没有声明(在数据建模语言文件中)。我可以像你说的那样做,但它不会比简单的排序typedef简单。 – remi000

1

不,一个typedef 不能被前向声明。

类类型,联合类型,以及使用该classstruct关键字时,关键字unionenum关键字,分别为(因为C++ 11)枚举类型可以是前向声明。例如

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

但是,类型定义不能前置声明,即使你肯定知道该类型是一类,联合或枚举。例如,这是不行的:

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

的原因是前置声明Foo隐式声明它是将由以后class Foo { /* ... */ };定义来定义同一类型,因此它是从所有先前定义的类型不同,所以当你后来说typedef Bar Foo;时,你与前面所说的矛盾。

+0

谢谢。我想我会对所有的typdefs进行排序,并摆脱这个问题! – remi000

0

前向声明可以使用typedef。但使用

typedef typeA typeB 

typeA应该有向前声明第一:

struct typeA; 
typedef typeA typeB