问题描述如下:文件B.h里有函数声明,这个函数的参数类型使用了结构体S。所以B.h文件需要包含定义了S的头文件A.h。
但是当编译B.h文件时,却报错说S未定义。这是因为A.h和B.h两个头文件互相包含了,且包含的顺序不正确。具体来说:A.h文件先包含了B.h文件,
然后A.h文件又定义了结构体S。因为B.h文件在包含A.h文件之前就使用了S,所以在B.h里面,S这个类型还没定义就使用了,因此编译器认为S未定义,所以报错。要解决这个问题,只需要更改A.h和B.h两个文件的包含顺序:在A.h文件中,先定义结构体S,再包含B.h文件。这样,在B.h文件使用S类型时,S已经被定义了,就不会再报未定义的错误。也就是说,如果两个头文件互相包含,且都定义或使用了某个类型。我们需要确保在任何一个头文件使用该类型之前,该类型已经被定义了。只要包含顺序正确,就可以解决“未定义”错误。
当出现这类错误时,首先要检查被报错的类型或函数是否已经定义;其次要检查定义与声明的顺序是否正确,是否有互相包含的头文件顺序挪动的必要。