没有定义的 typedef 结构
typedef struct with no definition
我正在查看我使用的 C++ 库的 headers,其中有这样一行:
typedef struct asdf_t asdf_t;
源代码中的任何地方都没有 asdf_t
的定义。这条线在做什么?
这就是所谓的声明 不透明结构! header 中可能有函数 and/or classes 使用 指针 到 asdf_t
类型 - 这在 C++ 中是允许的'undefined' 结构。但是,不会(不能)有变量、class 成员或函数参数声明为 asdf_t
.
的 实例
因此,例如,您的 header 稍后可能会声明以下内容 class:
class GoodBoy {
public: GoodBoy();
~GoodBoy();
private:
asdf_t* forMyEyesOnly; // Only a pointer - definition not needed!
}
但是不能有这个:
class BadGirl {
public BadGirl();
~BadGirl();
private:
asdf_t notForAnyOneToSee; // Won't compile - would need definition.
}
为什么要这样做?
通常,这是因为您正在使用的库的创建者不想让您知道该结构的详细信息!但是,他们必须提供这样的 'minimial' 定义,以便您可以使用 classes、 等等 ,即必要时使用或引用该结构: 因此,例如,在 GoodBoy
class 的 实现 中(即私有源文件,其中 完整定义 给出了 asdf_t
),可以让构造函数和析构函数做类似的事情,比如说:
GoodBoy::GoodBoy() {
forMyEyesOnly = new asdf_t; // Note: Neither the 'new' operation, nor...
}
GoodBoy::~GoodBoy() {
delete forMyEyesOnly; // ...the 'delete' can compile without FULL DEFINITION!
}
澄清
通常,这样的不透明结构 只需通过以下方式声明:struct asdf_t;
!然而,typedef struct asdf_t asdf_t;
和 typedef struct asdf_t;
也是有效的语法(如果有点奇怪的话)。
进一步阅读
关于不透明结构以及如何声明它们的 Stack Overflow 讨论很好(如果有点旧),here。
这是一个转发声明,如果没有定义,基本上你也可以使用这个类型(所以你不能做任何需要知道他的确切定义的事情,例如你不能复制,因为编译器必须知道他的尺寸)。
- 例如,您可以在相同的头文件中定义一些函数原型。
- 你可以定义一个指针和copy/pass这个指针(不用访问他的数据)。
这也称为 ADT (https://en.wikipedia.org/wiki/Abstract_data_type)
更详细地说,你可以做这样的事情,编译器(和程序员)会知道 ADT*
它是一个不同于示例的类型 char*
:
typedef struct adt ADT;
void swap(ADT **a, ADT **b) {
ADT *tmp = *a;
*a = *b;
*b = tmp;
}
我正在查看我使用的 C++ 库的 headers,其中有这样一行:
typedef struct asdf_t asdf_t;
源代码中的任何地方都没有 asdf_t
的定义。这条线在做什么?
这就是所谓的声明 不透明结构! header 中可能有函数 and/or classes 使用 指针 到 asdf_t
类型 - 这在 C++ 中是允许的'undefined' 结构。但是,不会(不能)有变量、class 成员或函数参数声明为 asdf_t
.
因此,例如,您的 header 稍后可能会声明以下内容 class:
class GoodBoy {
public: GoodBoy();
~GoodBoy();
private:
asdf_t* forMyEyesOnly; // Only a pointer - definition not needed!
}
但是不能有这个:
class BadGirl {
public BadGirl();
~BadGirl();
private:
asdf_t notForAnyOneToSee; // Won't compile - would need definition.
}
为什么要这样做?
通常,这是因为您正在使用的库的创建者不想让您知道该结构的详细信息!但是,他们必须提供这样的 'minimial' 定义,以便您可以使用 classes、 等等 ,即必要时使用或引用该结构: 因此,例如,在 GoodBoy
class 的 实现 中(即私有源文件,其中 完整定义 给出了 asdf_t
),可以让构造函数和析构函数做类似的事情,比如说:
GoodBoy::GoodBoy() {
forMyEyesOnly = new asdf_t; // Note: Neither the 'new' operation, nor...
}
GoodBoy::~GoodBoy() {
delete forMyEyesOnly; // ...the 'delete' can compile without FULL DEFINITION!
}
澄清
通常,这样的不透明结构 只需通过以下方式声明:struct asdf_t;
!然而,typedef struct asdf_t asdf_t;
和 typedef struct asdf_t;
也是有效的语法(如果有点奇怪的话)。
进一步阅读
关于不透明结构以及如何声明它们的 Stack Overflow 讨论很好(如果有点旧),here。
这是一个转发声明,如果没有定义,基本上你也可以使用这个类型(所以你不能做任何需要知道他的确切定义的事情,例如你不能复制,因为编译器必须知道他的尺寸)。
- 例如,您可以在相同的头文件中定义一些函数原型。
- 你可以定义一个指针和copy/pass这个指针(不用访问他的数据)。
这也称为 ADT (https://en.wikipedia.org/wiki/Abstract_data_type)
更详细地说,你可以做这样的事情,编译器(和程序员)会知道 ADT*
它是一个不同于示例的类型 char*
:
typedef struct adt ADT;
void swap(ADT **a, ADT **b) {
ADT *tmp = *a;
*a = *b;
*b = tmp;
}