【发布时间】:2017-08-25 03:18:32
【问题描述】:
我们正在开发两个 C++ 代码库,我们称之为 A 和 B,A 是作为库的构建,并将头文件.h和.a文件分发到B。
假设A中有Lock.h文件如下:
// Lock.h in code base A
class Lock {
... ...
#ifdef TRACK_THREAD_OWNER_FOR_DEBUG
virtual int GetLockOwner();
#endif
... ...
private:
CriticalSection section;
#ifdef TRACK_THREAD_OWNER_FOR_DEBUG
int threadOwner;
#endif
};
// Caller.cc in code base B
#include "xxx/xxx/Lock.h"
Lock lockObject;
lockObject.Lock();
在代码库 A 中,我们默认启用TRACK_THREAD_OWNER_FOR_DEBUG,并且可能会在最终发布日之前对其进行更改。
我们遇到了一些严重的错误,因为TRACK_THREAD_OWNER_FOR_DEBUG 在 A 和 B 中不同,并且由于 sizeof(Lock) 在两个库中不同而导致内存损坏。
那么如何避免这个错误呢?如果构建宏TRACK_THREAD_OWNER_FOR_DEBUG在两个项目中不同,我们可以在构建caller.cc文件时触发编译器错误吗?
【问题讨论】: