gpt4 book ai didi

c++ - CRITICAL_SECTION 并避免包含 windows.h?

转载 作者:可可西里 更新时间:2023-11-01 13:28:03 25 4
gpt4 key购买 nike

我有一个这样声明的接口(interface):

    #if defined _WIN32 || _WIN64
typedef CRITICAL_SECTION MutexHandle;
#else
typedef pthread_mutex_t MutexHandle;
#endif

class IMutex
{
public:
enum MutexState
{
UNLOCKED = 0,
LOCKED
};

virtual ~IMutex() { }

virtual int32_t Lock() = 0;
virtual int32_t Unlock() = 0;

virtual const MutexState& GetMutexState() const = 0;
virtual MutexHandle& GetMutexHandle() = 0;
};

问题是,我需要为 CRITICAL_SECTION 定义包含 windows.h;

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#undef WIN32_LEAN_AND_MEAN

但这不会导致可能的 header 包含其他使用该界面的问题吗?

如何在不包含整个 windows.h 的情况下声明我的 typedef?

谢谢

最佳答案

防止实现细节泄漏到其他代码中的典型方法是使用 Pimpl Idiom。这个想法是让你的类只包含一个指向实际实现的指针。由于真正的实现存在于 .cpp 文件中,因此它可以包含所需的任何内容,而不会污染类用户的命名空间。

在头文件中:

#include <memory>  // for std::unique_ptr

class Mutex {
public:
Mutex();
~Mutex();
void Lock();
// ...
private:
class Impl;
std::unique_ptr<Impl> m_pimpl;
};

然后在实现(.cpp)类中:

#include <windows.h>  // nobody else sees this

class Mutex::Impl {
public:
Impl() {
::InitializeCriticalSection(&m_cs);
}
~Impl() {
::DeleteCriticalSection(&m_cs);
}

void Lock() {
::EnterCriticalSection(&m_cs);
}

// etc.

private:
CRITICAL_SECTION m_cs;
};

// This maps the externally visible Mutex methods to the
// ones in the Implementation.
Mutex::Mutex() : m_pimpl(new Mutex::Impl()) {}
Mutex::~Mutex() {}
void Mutex::Lock() { m_pimpl->Lock(); }

您可以将整个实现放入#ifdef block 中,或放在单独的 .cpp 文件中(例如,mutex_win.cpp、mutex_posix.cpp 等),并只使用适合您的构建类型的正确文件。

一般来说,Pimpl Idiom 需要额外的指针取消引用,但您的虚拟方法解决方案也是如此。

关于c++ - CRITICAL_SECTION 并避免包含 windows.h?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com