最近帮助同事解决了一个必崩的问题。看似挺小儿科的问题,却暴露了编码过程的不良习惯。
同事写了一个数据处理类CXXXProcess,放在libXXX工程里。同时提供接口IXXXProcess供他人使用。这没什么问题。问题是,为方便做一些debug下的统计,CXXXProcess里使用#ifdef声明了一个数组,而这个宏放在VS的预处理器。
class CXXXProcess : public IXXXProcess
{
// ...
// ...
#ifdef XXX_DEBUG
float statData_[100];
#endif
}
结果是,其它同事在另外的工程使用这个类库,必然崩溃。因为除了类库作者,没人去知道XXX_DEBUG这个宏。
实际上,良好的设计,应该做到让上层调用者只关心接口,而不关心内部实现。