前几天写过前置声明的问题,不过今天写代码时又遇到了同样的问题,不过是一个typedef出来的问题。
前置声明的好处很多, 比如能避免头文件互相包含的冲突, 比如有时我们在一个头文件中只需要另一个头文件的某个类型定义, 只需要对它做一下前置声明即可,
因为为了相对较小的目的要包含进来一个很大的头文件, 实在有些"不值", 况且这个头文件可能还要被其它很多文件再包含的, 这样代价就更大了.
所以做前置声明即可, 在源文件真正需要的时候再包含那个头文件.
之前也声明过类和c++方式定义的struct, 今天遇到了一个typedef的结构体, 结果前置声明不奏效了.
网上查了些资料, 有的帖子没有讨论出结果, 有的直接定性typedef的不能前置声明, 只能include进来.
幸好自己写小例子多测试了一会, 发现语法上还是支持的. 举例如下:
#coord.h:
typedef struct coord_t
{
int hour, minute, second;
} my_coord_time;
#flagment.h
// #include "coord.h" 不需要增加该头文件,采用前置声明的方式
struct coord_t;
typedef struct coord_t my_coord_time;
void set_and_print(my_coord_time* mtime) {}
#main.cpp
#include "coord.h"
#include "flagment.h"
int main(){
my_coord_time mtime;
func(&mtime);
return 0;
}
这样就可以成功了. 在flagment.h中做前置声明时, 先声明有my_coord_time_t这样一个struct, 然后说明 my_coord_time 是由那个结构体typedef出来的,
这样void set_and_print(my_coord_time* mtime)这个函数声明就能编译通过了. 直接做struct my_coord_time;这样的前置声明是不被接受的.