我在一些我看不懂的代码中遇到了这个声明.
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上对此进行了测试,并且引用此类型对我来说很好.
既然
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)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |