20200914 struct无法向前声明

Issue

今天搞了一个多小时研究一个编译问题。

在A头文件中定义的struct,想在B头文件中使用。

一般对于这种在别的头文件里定义的类型,我们都是使用向前声明。比如

1
class Foo;

然后就「基本」可以正常使用了,结果今天向前声明struct不生效。

查了资料,得到 结论 如下:

大多数情况下向前声明struct是无效的。因为向前声明只是告诉编译器有这个东西,但是具体这个东西是怎样的编译器暂时还未知。对于class,我们经常是用指针的形式使用的,所以并不需要知道class的具体内容,于是可以向前声明通过编译。但是对于struct来说,我们使用的时候通常不是通过引用的形式使用的,而是直接持有这块内存本身,所以需要知道这个类的细节。

也就是说,如果是这样可以编译通过

1
2
3
4
5
6
7
8
9
10
11
12
13
// FileA
struct MyStruct
{

};

// FileB
struct MyStruct;

class Foo
{
MyStruct* Foo;
}

但是这样是无法通过编译的:

1
2
3
4
5
6
7
8
9
10
11
12
13
// FileA
struct MyStruct
{

};

// FileB
struct MyStruct;

class Foo
{
MyStruct Foo;
}

向前声明enum class

和上面所讲到的道理一样,如果只是用了这个enum class本身这个类的typename而没有用其内容,那么向前声明有效,而如果用了enum class里面的某个值,就会编译报错。

正确:

1
2
3
4
5
6
7
8
enum class MyEnum;

void Foo(MyEnum Param);

enum class MyEnum
{
One, Two, Three
}

编译失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum class MyEnum;

void Foo(MyEnum Param)
{
// 这个时候还没有定义到enum内容,所以不存在One在MyEnum中
if(Param == MyEnum.One)
{
// ...
}
}

enum class MyEnum
{
One, Two, Three
}

References

Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//