Issue
今天搞了一个多小时研究一个编译问题。
在A头文件中定义的struct,想在B头文件中使用。
一般对于这种在别的头文件里定义的类型,我们都是使用向前声明。比如
1 | class Foo; |
然后就「基本」可以正常使用了,结果今天向前声明struct不生效。
查了资料,得到 结论 如下:
大多数情况下向前声明struct是无效的。因为向前声明只是告诉编译器有这个东西,但是具体这个东西是怎样的编译器暂时还未知。对于class,我们经常是用指针的形式使用的,所以并不需要知道class的具体内容,于是可以向前声明通过编译。但是对于struct来说,我们使用的时候通常不是通过引用的形式使用的,而是直接持有这块内存本身,所以需要知道这个类的细节。
也就是说,如果是这样可以编译通过
1 | // FileA |
但是这样是无法通过编译的:
1 | // FileA |
向前声明enum class
和上面所讲到的道理一样,如果只是用了这个enum class本身这个类的typename而没有用其内容,那么向前声明有效,而如果用了enum class里面的某个值,就会编译报错。
正确:
1 | enum class MyEnum; |
编译失败:
1 | enum class MyEnum; |