历史版本兼容问题 - 使用枚举值带来的潜在风险

 常常遇到这样的情况:
情况一:替换了发布了sdk的dll,.h,lib文件后,客户的程序崩溃了。

原因在于旧版的.h里面定义了某些枚举值,新版的.h里面增加了一个枚举值,但是,没有在枚举值的最后面增加。这导致,旧的枚举值的再新的.h及dll里面的取值不一样!导致程序崩溃了!

情况二:老蔡要对比不同的haar特征的分类性能。我找出以前训练好的分类器,1a,1b,1c, 2a,2b等训练好的分类器文件拿过来都可以用。而是用mean特征的时候却崩溃了! 奇怪,mean特征可是我最近不久才训练的,怎么会崩呢?
经查,是枚举值改变搞的鬼!

typedef enum _FEA_TYPE
{
 FT_EDGE_LEFT_RIGHT,     // 左右特征
 FT_EDGE_UP_DOWN,      // 上下特征
 FT_LINE_LEFT_MID_RIGHT,    // 左中右特征
 FT_LINE_LEFT_MID_MID_RIGHT,   // 左中中右特征
 FT_LINE_UP_MID_DOWN,    // 上中下特征
 FT_LINE_UP_MID_MID_DOWN,   // 上中中下特征
 FT_CENTROL_SURROUND,    // 中心-四周特征

 FT_LOW_FREQ,      // :低频直流特征,直接计算矩形的像素和
 FT_FACIAL_STRUCTURE,    // :面部几何结构特征
 FT_FACIAL_STRUCTURE_V2,    // :同上
 FT_FACIAL_STRUCTURE_V3,    // :同上
 FT_FACIAL_STRUCTURE_V1_1,   // :同上
 FT_MEAN,       // :计算矩形像素的均值

}FEA_TYPE; 
注意,在增加FT_FACIAL_STRUCTURE等特征时,没有在MEAN的后面增加,而是放在的MEAN的前面,这导致MEAN的枚举值改变。而之前训练好的分类器使用的是旧的枚举值!

总结:涉及到枚举值的相关变量,当增加新的枚举值时,要慎重,一般要加在旧的枚举值的最后。除非确定了该枚举值没有被以别的方式保存给第三方,比如训练好的分类器的特征文件,没有经过重新编译的客户程序,否则不可以在枚举值的中间新增枚举值!

本质上这类问题的都是由于数据序列化导致的! 著名的dll地域问题也是,增加一个虚函数,增加一个成员变量的新dll可能会都让客户程序崩掉!

你可能感兴趣的:(c,dll,UP,structure)