这是什么类型的typedef?

Neu*_*ino 1 c c++

我在一些我看不懂的代码中遇到了这个声明.

typedef struct foo_* foo;

int main(int argc, char** argv)
{
   foo a = nullptr;    // Ok. foo is a synonym for 'foo_*'
   foo_* b = a;  // Ok! somehow foo_* is a valid type, but where is it defined?

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

foo_之前未定义或声明该类型(这是一个完整的编译示例).我的理解是a typedef为已经存在的类型提供了同义词,并且在声明或定义之前不能使用类型.既然foo_以前没有宣布或定义过这是什么typedef,那怎么合法呢?

更新:

有人说这是可以的,因为typedef中的struct foo_*被假定为内联前向声明,并且实际上尝试使用foo_将失败.但我刚刚在VS2012上对此进行了测试,并且引用此类型对我来说很好.

πάν*_*ῥεῖ 5

既然foo_以前没有宣布或定义过这是什么typedef,那怎么合法呢?

一旦你想对它做任何有用的话,它会抱怨.前向声明的指针是正常的,但解除引用需要完整的类型.

typedef struct foo_* foo;

int main()
{
    foo bar;
    foo_ baz = *bar;
}
Run Code Online (Sandbox Code Playgroud)

失败并出现编译错误:

main.cpp: In function 'int main()':
main.cpp:7:10: error: variable 'foo_ baz' has initializer but incomplete type
     foo_ baz = *bar;
          ^
Run Code Online (Sandbox Code Playgroud)