交互头文件的作用和重要性
两个库之间交换数据需要操作库对外提供的函数进行,头文件里有函数和变量类型的声名,也就是定义了和库交换信息的协议。一般定义变量类型时都会有保留位,这是为将来做拓展时使用的。头文件里一旦定义好的函数名和变量类型是不能轻易改变的,一旦修改出错,就会导致函数出错,或者不能正确解析传输的数据,所以修改头文件需要慎重。
修改头文件的注意事项
1.修改头文件要注意兼容性,不能因为修改导致之前按照原有头文件写的代码不能运行;
2.要增加新功能时,如果需要占用保留位,需要尽量节省。能用char就不要用int;传达多个同类型变量不要用数组,用指针加数量的方式;
3.新增加的都往后添加,不要改变之前变量的顺序;
实例代码(修改前):
//BMP图片的信息头
typedef struct InfoHeader
{
int bisize;//信息头的大小,一般是40
int biWidth;//位图的宽
int biHeight;//位图的高
short biPlanes;//固定值1
short biBitCount;//每个像素的位数
int biCompression;//压缩方式,BI_RGB(0)为不压缩, BI_BITFIELDS(3)用于16位、32位位图
int biSizeImage;//位图全部像素占用的字节
int biXpelsPerMeter;//水平分辨率
int biYPelsPerMeter;//垂直分辨率
int biClrUsed;//位图使用的颜色数。0代表颜色数为2的biBitCount次方
int biClrImportant;//重要的颜色数,0代表所有颜色都重要
int reserved[20];
}BmpInfoHeader;
新增:
假如在头文件中存在这样一个结构体,最后定义了一个int型数组,这就是保留位。目前这20个int变量是没有实际意义,将来我们想要增加传达的信息,就可以来占用保留位。
1.我们想增加一个使能位,就可以不用int类型,用一个char类型就可以;
2.需要传递10个int型变量,就不要定义数组,而是用指针。在外面申请一块内存存放变量,然后把变量的个数和指针传递出去;
备注:这样占用保留位,而不是新增加变量的方式优点是结构体的大小始终保持不变。
实例代码(修改后):
//BMP图片的信息头
typedef struct InfoHeader
{
int bisize;//信息头的大小,一般是40
int biWidth;//位图的宽
int biHeight;//位图的高
short biPlanes;//固定值1
short biBitCount;//每个像素的位数
int biCompression;//压缩方式,BI_RGB(0)为不压缩, BI_BITFIELDS(3)用于16位、32位位图
int biSizeImage;//位图全部像素占用的字节
int biXpelsPerMeter;//水平分辨率
int biYPelsPerMeter;//垂直分辨率
int biClrUsed;//位图使用的颜色数。0代表颜色数为2的biBitCount次方
int biClrImportant;//重要的颜色数,0代表所有颜色都重要
char enable;
char reservedChar[3];
int num;
int *info; //指针指向的内存处依次存放num个int型变量
int reserved[17];
}BmpInfoHeader;