具有未声明/未定义类型的 typedef 结构

lam*_*bda 2 c c++ webrtc

我正在阅读有关VAD的webrtc源代码,我对代码感到困惑

typedef struct WebRtcVadInst VadInst;
Run Code Online (Sandbox Code Playgroud)

我搜索了所有关于WebRtcVadInst的代码,没有找到任何与struct WebRtcVadInst相关的来源。另一方面,我确实找到了一些关于VadInst 的信息。

typedef struct VadInstT_ {
    int vad;
    int32_t downsampling_filter_states[4];
    ...
    ...
    int init_flag;
} VadInstT;
Run Code Online (Sandbox Code Playgroud)

VadInst* WebRtcVad_Create() {
  VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT));

  WebRtcSpl_Init();
  self->init_flag = 0;

  return (VadInst*)self;
}
Run Code Online (Sandbox Code Playgroud)

并且,它编译成功。

它是如何工作的?

Bo *_*son 5

typedef 将前向声明和 typedef 组合在一行中。

在 C++ 中可以这样写

struct WebRtcVadInst;            // forward declare a struct

typedef WebRtcVadInst VadInst;   // and introduce an alternate name
Run Code Online (Sandbox Code Playgroud)

在这两种语言中形成指向未知结构的指针都没有问题,因为所有指向结构(以及 C++ 中的类)的指针都需要具有相同的大小。

因此,您显示的代码从不使用结构本身(如果它存在),而只使用指针(VadInst*)。从语言角度来说这没问题。