背景
我正致力于创建与数据建模语言的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来使这项工作吗?
答案 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开始)枚举类型可以使用class
或struct
关键字,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