没有定义的 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;
}