我们在大型项目中有一些中央类和函数,用于抽象实际平台类型,例如mutex、file、thread等。这是很好的,但我希望更进一步,不将任何系统包含在头文件中(例如
选项1:PImpl习惯用法
#include <windows.h>
),这将是真正的平台抽象和更快的编译。缺点是你不能只使用typedef来定义系统类型(例如Windows HANDLE)。选项1:PImpl习惯用法
class RwMutex
{
// .....
private:
struct Impl;
Impl* m_Impl;
}
- 优点:实现和平台类型在C++中被很好地隐藏。
- 缺点:涉及两阶段构造('new',我们没有异常),可能会失败。操作繁琐。
选项2:命名空间函数
class RwMutex {
public:
bool LockRead() {return RwMutexLockRead( this );}
private:
char m_AnonymousMember[ 16 ];
}
bool RwMutexLockRead( RwMutex* p );
- 优点:实现可以直接链接使用,非常适合将其放置在自己的库中。
- 缺点:涉及到重新解释成员所占用的空间,不利于调试。同时也需要大量的工作。
也许我对此有些着迷,但如果项目代码数量庞大并且没有任何平台相关的包含文件,那么通过-nostdinc
选项来强制执行这一点会很酷。